我正在尝试使用套接字(从客户端到服务器)发送长整数。 客户端和服务器都是x86(和相同的机器)。客户端将21个长整数写入套接字,服务器将其读出。
以下是代码的一部分。
服务器:
long int num = 0;
int ret;
for (int i = 0; i < 21; i++) {
if ((ret = read(sfd_client, (char *) &num, sizeof(num))) == -1) {
perror("read");
exit(1);
}
printf("number = %d = %ld ret = %d\n", i, num, ret);
}
客户:
for (int i = 0; i < 21; i++) {
if (write(sockfd_client, &temp[i], sizeof(long int)) == -1) {
exit(1);
}
}
我注意到在调用read之后,返回值正好是8,这意味着读取了8个字节;然而数据总是0.我不明白我做错了什么。此外,我正在查看各种功能,并且所有功能都符合无符号数字但未签名(ntoh和hton系列)。
注意:另外我注意到第一个read()是8个字节,但是下面的只有1个字节。
我能传递所有这些数字的最佳方式是什么? (另外我注意到,如果我在那里有read语句,for循环拒绝退出。)
解决方案(问题在于读取返回的字节数少于所需的字节数,此函数解决了它)
void read_long(int sockfd_client, char *num) {
unsigned int size = sizeof(long int);
int rlen = 0;
int ret;
while (rlen < size) {
if ((ret = read(sockfd_client, (num + rlen), size - rlen)) == -1) {
perror("read_long");
exit(1);
}
if (ret == 0) {
perror("socket closed before consumption");
exit(1);
}
rlen += ret;
}
}
答案 0 :(得分:3)
[我将重复我的评论作为答案,因为它证明是正确的]
请注意,使用read()
致电sizeof(num)
会返回最多 sizeof(num)
个字节。它可能会返回更少,并且您有责任积累它们。
类似地,write()
不保证写入请求的字节数。您需要检查write的返回值以查看实际写入的字节数,然后写入剩余的字节。