【发布时间】:2018-09-19 12:22:06
【问题描述】:
以下是我的 C/S 代码和输出仅供测试。
我遇到了麻烦。
很明显,我只是通过客户端发送了两次。但是,服务器刚刚收到 3 条消息。第二个似乎是 NULL。
#define MP_MAXLINE 4096
/* client */
int main(int ac, char *av[])
{
char buf[MP_MAXLINE];
int clifd;
struct sockaddr_in cliaddr;
if((clifd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
perror("socket error");
memset(&cliaddr, 0, sizeof(struct sockaddr_in));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(atoi(av[2]));
inet_pton(AF_INET, av[1], &cliaddr.sin_addr);
if(connect(clifd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)))
perror("can not connect to server");
printf("enter data to send: ");
while(fgets(buf, MP_MAXLINE, stdin) != NULL){
write(clifd, buf, sizeof(buf));
printf("enter data to send: ");
}
}
/* server */
static void cli_service(int clifd){
int lclifd, rcv_cnt = 0;
char data[MP_MAXLINE];
for(;;){
if(read(clifd, data, sizeof(data)) == 0)
exit(1);
rcv_cnt++;
printf("cnt: %d, data: %s", rcv_cnt, data);
}
}
int main(int ac, char *av[])
{
...
for(;;){
clifd = accept(svrfd, (struct sockaddr *)&cliaddr, &clisocklen);
if((clipid = fork()) < 0){
printf("fork error\n");
continue;
}
else if(clipid == 0){
close(svrfd);
cli_service(clifd);
}
close(clifd);
continue;
}
}
客户端的输出在这里:
输入要发送的数据:1111
输入要发送的数据:2222
输入要发送的数据:
服务器的输出在这里:
cnt:1,数据:1111
cnt:2,数据:cnt:3,数据:2222
【问题讨论】:
-
大家好,我想知道为什么会这样,我该如何解决。
-
函数:
perror()不退出程序,也不修复错误。所以在调用perror()之后应该调用exit( EXIT_FAILURE );
标签: c linux sockets unix tcp-ip