初学C 网络编程, 书上照抄例子, 但是出错。
服务端: 接受客服端输入的字符, 转换为大写, 送回。
- C/C++ code
/* server.c */#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#define MAXLINE 80#define SERV_PORT 8000int main(void){ struct sockaddr_in servaddr, cliaddr; socklen_t cliaddr_len; int listenfd, connfd; char buf[MAXLINE]; char str[INET_ADDRSTRLEN]; int i, n; listenfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(SERV_PORT); bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); listen(listenfd, 20); printf("Accepting connections...\n"); while (true) { cliaddr_len = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len); n = read(connfd, buf, MAXLINE); printf("received from %s at port %d\n", inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)), ntohs(cliaddr.sin_port)); for (i = 0; i < n; i++) buf[i] = toupper(buf[i]); write(connfd, buf, n); close(connfd); } return 0;}客服端: 发送字符数据
- C/C++ code
/* client.c */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/in.h>#define MAXLINE 80#define SERV_PORT 8000intmain(int argc, char *argv[]){ struct sockaddr_in servaddr; char buf[MAXLINE]; int sockfd, n; char *str; if (argc != 2) { fputs("usage: ./client message\n", stderr); return 1; } str = argv[1]; sockfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr); servaddr.sin_port = htons(SERV_PORT); connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); write(sockfd, buf, MAXLINE); printf("Response from server: \n"); write(STDOUT_FILENO, buf, n); close(sockfd); return 0;}运行环境:
平台——Linux 64 位系统
gcc——4.6.3
运行结果:
server 提示如下错误
Accepting connections ...
Segmentation fault (core dumped)
client 收到结果是乱码
我没有抄错代码, 我复制粘贴试过了, 一样出问题。
[解决办法]
你发送过去的就是乱码
缺一行代码
strcpy(buf,str);
[解决办法]
用gdb调试下
[解决办法]
服务器端:
printf("received from %s at port %d\n",
inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
ntohs(cliaddr.sin_port));
其中inet_ntop返回值是int,以%s去显示它,导致core
应该用char *inet_ntoa(...)来显示客户端的IP地址
[解决办法]
/*client.c 从哪里获取的server response?*/
write(sockfd, buf, MAXLINE);//向服务器写
printf("Response from server: \n");
write(STDOUT_FILENO, buf, n);//向标准输出写
在写向标准输出写前,先从服务器读,加上
n=read(sockfd,buf,MAXLINE);
[解决办法]
------解决方案--------------------
客户端的n呢,客户端的发buf干啥?发MAXLEN干啥?str不用?strlen呢?服务端的\0呢?
[解决办法]
以前我也不加-Wall,后来习惯在makefile里面加上它,一方面能发现更多的问题,一方面能养成自己良好的编程习惯。
有些库GCC是可以帮你加载的,有些函数GCC是可以帮你声明的。
但是……还是相信自己最好