c - 发送和接收缓冲区大小不同时出现问题

标签 c sockets send recv

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

以下是最相关的代码:

听众:

#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/

相关文章:

c - 如何检查 Windows 文件索引是打开还是关闭

sockets - 无法导入socket模块

sockets - send() 中的套接字错误 -- 没有这样的文件或目录

U盘的扇区大小可以修改吗?

c - 使用c编程运行shell脚本

在这种情况下我可以不使用发布和获取障碍吗?

android - 如何从 Linux 连接到 Android 蓝牙 socket

sockets - 如何将现有的 udp 应用程序迁移到原始套接字

php - 如何通过 MailChimp 3.0 api 发送电子邮件?

android - 如何像我们在 Android 应用程序中使用 Intent.ACTION_SEND 那样通过 iOS 应用程序中的其他应用程序共享内容/数据?