2013-04-06 102 views
-1

仍嘗試理解send()和recv()函數。爲什麼這不起作用?沒有在服務器輸出上打印出來(除了一些測試「cout」)基本Send()和Recv()TCP服務器和客戶端C++

這基本上是我搞亂的代碼的一部分。

客戶端:

char *mesg_to_send; 
Socket servSock; 
mesg_to_send = The King is Dead!"; 
// Establish the connection to the echo server 
if(connect(servSock, (struct sockaddr *) &srvr_addr, sizeof(srvr_addr)) < 0) 
    DieWithError("connect() failed"); 
send(servSock, (char*) mesg_to_send, sizeof(int), 0); 

服務器端:

char *sentence; 
Socket clnt_socket; 
// Wait for the client to connect 
if((clnt_socket = accept(srvr_socket, (struct sockaddr *) &clnt_addr, &addr_len)) < 0) 
    DieWithError("accept() failed"); 
recv(clnt_socket, (char*) sentence, sizeof(int), 0); 
cout << sentence; 

回答

1

向右走,你必須在你的代碼的幾個問題,那就是除了語法錯誤(你的意思是在The King之前有開頭報價?)。 Did you really compile and test the same code that you posted?

  • 而不是發送整個句子的,你只發送第一sizeof(int)字節。由於sizeof(int)可能在您的平臺上4,這意味着您可能只發送「The」。

  • 同樣,您只讀取服務器上客戶端的sizeof(int)字節。您可能想要讀入更大的緩衝區,並且只要客戶端發送數據(即,只要您不讀取EOF),就一直保持循環讀取。

  • 什麼數據類型是Socket?套接字文件描述符應該保存在類型爲int的變量中。

  • 在服務器端,您不初始化sentence緩衝區。當你將它傳遞給recv時,它是一個未初始化的指針,可能指向隨機存儲器。

  • 您也可能未在服務器上初始化addr_len(在調用recv之前,應將其初始化爲sizeof(clnt_addr))。