我是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 };
答案 0 :(得分:5)
您使用strlen
,但数组不会以空值终止。使用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。
答案 1 :(得分:1)
只有当字符串的最后一个字符为'\ 0'(十六进制值为0x00)时,strlen才会返回正确的字符串长度。这里,字符串不是NULL终止,这导致发送垃圾值。