2011-11-01 275 views
0

我是C/C++的新手。我正在使用以下代碼將多條消息發送到我的服務器。 CONNECT消息,新行,然後是空終止符。但是當我發送這些消息時,他們正在轉換某處。我收集了使用Wireshark交換的消息。由於我發送的內容和發送到服務器的內容有所不同,因此我的服務器無法正常響應。請幫忙。謝謝。在C/C++中通過套接字發送多個消息

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 }; 

回答

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

+0

太好了。有用。謝謝。 – M99

1

的strlen返回字符串的正確長度只有當字符串的最後一個字符是'\ 0'(這是十六進制值0x00)。在這裏,字符串不是NULL結尾,導致發送垃圾值。