发送和recv缓冲区大小不同时出现问题

时间:2012-04-08 11:30:53

标签: c sockets send recv

我是套接字编程的初学者,当我使用不同的缓冲区大小为发送方和接收方通过套接字发送数据时,我遇到了问题。 我必须制作2个基本程序,说话者和听众。一个必须发送传递给stdin的所有内容,通过套接字发送它,接收器必须打印数据。 问题是当我为发送方和接收方使用不同的缓冲区大小时,接收方打印的数据不完整或无序。我不明白为什么?

以下是最相关的代码:

听众:

#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    

我做错了什么?

感谢您的工作!

1 个答案:

答案 0 :(得分:2)

由于您只发送字符串,因此不应始终发送完整缓冲区,而应仅发送“字符串的长度”,即使用strlen(buffer)而不是sizeof buffer。然后奇怪的行为应该消失。

if ((numbytes = send(sockfd, buffer, strlen(buffer), 0)) == -1) {
...