gpt4 book ai didi

C 套接字 read() 返回值

转载 作者:行者123 更新时间:2023-11-30 15:23:27 27 4
gpt4 key购买 nike

我正在开发一个 C 项目,使用服务器/客户端结构将文件从一个 IP 地址发送到另一个 IP 地址。通过阅读其他帖子,我了解到只有当套接字关闭时,从套接字读取才会返回 0。

服务器端的相关代码(socket()、bind() 和accept() 的行为符合预期)

char *toSend = malloc(packet_size);
size_t bytesRead;
while ((bytesRead = fread(toSend, sizeof(char), packet_size, fp)) > 0) {
printf("Sending: %s \n", toSend);
write(newsockfd, toSend);
usleep(packet_delay*1000000);
}

在客户端:

char buffer[256];
int numRead;
while ((numRead = read(sockfd, buffer, 255)) > 0) {
printf("read %d\n", numRead);
printf("%s\n", buffer);
fwrite(buffer, sizeof(char), 255, fp);
}

客户端 connect() 调用返回 0 表示成功,但第一次调用 read(sockfd, buffer, 255) 返回 0,尽管套接字当时处于打开状态;这似乎是不可能的。有人有一些建议吗?谢谢。

最佳答案

我发现您以错误的方式写入数据,您是否有 write() 的包装器系统调用?

正确的签名是

ssize_t write(int fd, const void *buf, size_t count);

所以你必须传递你正在写入的数据的长度,同时通过捕获返回值并正确检查它是否成功写入。

read()的返回值0并不意味着发生了错误,而是意味着当有错误时没有数据可读取read() 返回 -1

如果需要等到有数据,请使用select()这是一个例子

fd_set         set;
struct timeval tv;

FD_ZERO(&set);
FD_SET(sockfd, &set);

tv.tv_sec = TIMEOUT;
tv.tv_usec = 0;

if ((select(sockfd + 1, NULL, &set, NULL, &tv) != 1) || (FD_ISSET(sockfd, &set) == 0))
return timedOutWaitingForData();

proceedReadingFrom(sockfd);

如您所见,您可以自由设置超时值。

关于C 套接字 read() 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28789716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com