首页 文章

C socket read()返回值

提问于
浏览
0

我正在开发一个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,尽管当时套接字是打开的;这似乎不应该是可能的 . 有没有人有一些提示?谢谢 .

1 回答

  • 1

    我看到你正在以错误的方式写数据,你有一个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);
    

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

相关问题