【发布时间】:2016-01-23 16:42:13
【问题描述】:
尝试基于套接字在 C 中编写 echo server\client 代码。 我无法确定 fgets() 是如何工作的。
如果读取了换行符,则将其存储到缓冲区中。终止空值 字节 ('\0') 存储在缓冲区中的最后一个字符之后。
while (fgets(sendline, MAXLINE, stdin) != NULL) {
sendline[strlen(sendline)-1] = '\0';
send(sockfd, sendline, strlen(sendline), 0);}
但是我在服务器上得到了什么:
String received from and resent to the client:1234567890
String received from and resent to the client:abc
567890
如您所见,'\n' 字符添加到第二行,并尝试先用新行覆盖。但是在客户端,我看到缓冲区在使用 send() 时没有'\n'。
按 ctld+D (EOF) 按预期工作。
如何预防?并使用 Enter 键发送?
【问题讨论】:
-
使用
'\0'而不是'0'— 数字 0 和空字节之间有很多区别。 -
警告:如果输入超过 MAXLINE,则 fgets 将分割输入以适应 buff,然后是唯一最后一个以 '\n' 字符结尾的部分。
-
现在我认为这不是 fgets(),而是 recv()。因为即使在 memset(&sendline, 0, strlen(sendline));
-
因为您只发送 strlen(sendline) 空字符不包括在内。在客户端的接收中,您必须自己包含它,或发送 strlen(sendline)+1。
-
部分问题可能出在接收代码中,发布有助于解决问题。
标签: c sockets newline system-calls fgets