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);
如您所见,您可以自由设置超时值。
我正在开发一个 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);
如您所见,您可以自由设置超时值。