在C/ c++中通过套接字发送多个消息

Sending multiple message over a socket in C/C++

本文关键字:消息 套接字 c++      更新时间:2023-10-16

我是C/c++新手。我使用以下代码向服务器发送多条消息。一个CONNECT消息,一个新行,然后一个空终止符。但是当我发送这些信息时,它们在某处被转化了。我收集了使用Wireshark交换的消息。因为我发送的内容和真正发送到服务器的内容不同,我的服务器不能很好地响应。请帮助。谢谢你。

C代码(我想发送的):

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    char peer0_0[] = {0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x0d, 0x0a };
    char peer0_1[] = {0x0d, 0x0a }; //NEW LINE
    char peer0_2[] = {0x00, 0x0d, 0x0a }; //NULL TERM
    n = send(sockfd,peer0_0,strlen(peer0_0),0);
    n = send(sockfd,peer0_1,strlen(peer0_1),0);
    n = send(sockfd,peer0_2,strlen(peer0_2),0);

我在Wireshark中看到的(转到服务器):

    char peer0_0[] = {0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x0d, 0x0a };
    char peer0_1[] = {0x0d, 0x0a, 0xc3, 0x5f, 0xff, 0x7f };

您使用strlen,但是数组不是null终止的。使用sizeof:

n = send(sockfd,peer0_0,sizeof(peer0_0),0);
n = send(sockfd,peer0_1,sizeof(peer0_1),0);
n = send(sockfd,peer0_2,sizeof(peer0_2),0);

strlen不是很好,因为您在第三个数组(第一个字节)中有空终止符,因此strlen(peer0_2) = 0。

strlen仅在字符串的最后一个字符为''(即十六进制值0x00)时返回字符串的正确长度。在这里,字符串不是NULL终止的,这会导致发送垃圾值。