[英]C socket read() return value
我正在一個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);
如您所見,您可以自由設置超時值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.