我是套接字编程的初学者,当我使用发送者和接收者的不同缓冲区大小通过套接字发送数据时遇到问题。 我必须制作两个基本程序,说话者和听众。必须发送传递到标准输入的所有内容,通过套接字发送,并且接收者必须打印数据。 问题是,当我为发送方和接收方使用不同的缓冲区大小时,接收方打印的数据不完整或无序。我不明白为什么?
以下是最相关的代码:
听众:
#define BUFFERSIZE 20
...
while((numbytes = recv(new_fd, buf, BUFFERSIZE - 1, 0)) > 0) {
buf[numbytes] = 0;
printf("%s", buf);
}
perror("recv");
说话者:
#define BUFFERSIZE 10
...
while(fgets(buffer, BUFFERSIZE , stdin) != NULL)
{
printf("%s", buffer);
if ((numbytes = send(sockfd, buffer, sizeof buffer, 0)) == -1) {
perror("talker: sendto");
exit(1);
}
printf("\n");
}
例如,使用此测试文件:
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
它会打印
➜ ./listener
abcdefghijklmnopqrabcdefghiiz
recv: Success
abcdefghijklmnopqrr
我做错了什么?
感谢您的工作!
最佳答案
由于您只传输字符串,因此不应总是发送完整的缓冲区,而应仅发送“字符串的长度”,即使用 strlen(buffer)
而不是 sizeof buffer
。那么奇怪的行为应该就会消失。
if ((numbytes = send(sockfd, buffer, strlen(buffer), 0)) == -1) {
...
关于c - 发送和接收缓冲区大小不同时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10062480/