【问题标题】:trouble when send and recv buffer size are different发送和接收缓冲区大小不同时的麻烦
【发布时间】:2012-04-21 04:37:36
【问题描述】:

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

以下是最相关的一段代码:

听众:

#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    

我做错了什么?

感谢您的工作!

【问题讨论】:

  • MAXBUFLEN的值是多少?
  • 这是一个错误:它应该是 BUFFERSIZE。谢谢:)

标签: c sockets send recv


【解决方案1】:

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

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

【讨论】:

  • 不错。奇怪的行为现在似乎消失了!
  • 您总是传输完整的缓冲区,而不是将其设置为零。例如,奇怪的行为可能是由缓冲区中的一些剩余伪影引起的。您可以尝试在send() 之后插入bzero(buffer,BUFFERSIZE);。这也应该解决奇怪的行为。
猜你喜欢
  • 2015-12-22
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-11-08
  • 2021-03-15
相关资源
最近更新 更多