【问题标题】:Send int over socket in C/C++在 C/C++ 中通过套接字发送 int
【发布时间】:2012-12-18 23:24:44
【问题描述】:

我在通过套接字发送整数数组时遇到了麻烦。 代码是这样的

程序1:(在windows上运行)

int bmp_info_buff[3];

/* connecting and others */

/* Send informations about bitmap */
send(my_socket, (char*)bmp_info_buff, 3, 0);

程序 2:(在中微子上运行)

/*buff to store bitmap information size, with, length */
int bmp_info_buff[3];

/* stuff */

/* Read informations about bitmap */
recv(my_connection, bmp_info_buff, 3, NULL);
printf("Size of bitmap: %d\nwidth: %d\nheight: %d\n", bmp_info_buff[0], bmp_info_buff[1], bmp_info_buff[2]);

它应该打印 位图大小:64
宽度:8
高度:8

位图大小:64
宽度:6
身高:4096
我做错了什么?

【问题讨论】:

    标签: c++ c winsock qnx-neutrino


    【解决方案1】:

    当您将bmp_info_buff数组作为char数组发送时,bmp_info_buff的大小不是3而是3 * sizeof(int)

    recv 也一样

    替换

    send(my_socket, (char*)bmp_info_buff, 3, 0);
    recv(my_connection, bmp_info_buff, 3, NULL);
    

    通过

    send(my_socket, (char*)bmp_info_buff, 3*sizeof(int), 0);
    recv(my_connection, bmp_info_buff, 3*sizeof(int), NULL);
    

    【讨论】:

    • 但是字节排序问题呢?将整数从大端机器写入小端机器需要使用htonlntohl 等。
    • 此外,请确保检查来自sendrecv 的返回值。只有这样才能确定到底发生了什么。
    【解决方案2】:

    send()recv() 的大小参数以字节为单位,而不是 ints。您发送/接收的数据太少。

    你需要:

    send(my_socket, bmp_info_buff, sizeof bmp_info_buff, 0);
    

    recv(my_connection, bmp_info_buff, sizeof bmp_info_buff, 0);
    

    另请注意:

    • 这会使您的代码对字节字节序问题敏感。
    • int 的大小在所有平台上并不相同,您也需要考虑这一点。
    • 不需要转换指针参数,它是void *
    • 您还应该添加代码来检查返回值,I/O 可能会失败!
    • recv() 的最后一个参数不应该是您的代码中的 NULL,它是一个标志整数,就像在 send() 中一样。

    【讨论】:

    • +1。但是人们不知道sizeof 关键字还是什么?
    • 另外,还有一个关于可能添加 32/64 位不匹配的问题。
    猜你喜欢
    • 2017-08-26
    • 2023-03-19
    • 2013-03-24
    • 2015-01-02
    • 2013-07-22
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多