C socket read()返回值

时间:2015-03-01 03:19:06

标签: c sockets client-server

我正在使用服务器/客户端结构在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 个答案:

答案 0 :(得分:1)

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

正确的签名是

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

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

来自0的{​​{1}}的返回值并不意味着发生了错误,这意味着没有数据可供读取,当出现错误时read()返回{ {1}}。

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

read()

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