发送'签署long int'通过套接字

时间:2015-07-16 01:10:05

标签: c sockets tcp

我正在尝试使用套接字(从客户端到服务器)发送长整数。 客户端和服务器都是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;
    }
}

1 个答案:

答案 0 :(得分:3)

[我将重复我的评论作为答案,因为它证明是正确的]

请注意,使用read()致电sizeof(num)会返回最多 sizeof(num)个字节。它可能会返回更少,并且您有责任积累它们。

类似地,write()不保证写入请求的字节数。您需要检查write的返回值以查看实际写入的字节数,然后写入剩余的字节。