C 套接字读取()return 值

C socket read() return value

我正在开发一个 C 项目,使用 server/client 结构将文件从一个 IP 地址发送到另一个 IP 地址。通过阅读其他帖子,我了解到只有当套接字关闭时,从套接字读取才会 return 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() 调用 returns 0 成功,但第一次调用 read(sockfd, buffer, 255) returns 0,尽管当时套接字已打开;这似乎是不可能的。有人有一些提示吗?谢谢。

我看到你写数据的方式不对,你有write()系统调用的包装器吗?

正确的签名是

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

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

read()得到0的return值并不意味着发生了错误,它意味着没有数据可读,当有错误时[=14] =] returns -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);

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