2014-01-29 180 views
0

我得到了創建一些Chat Client的任務。服務器給出並且代碼未知(只有可執行文件)。客戶端/服務器通過TCP進行通信。首先客戶端連接到服務器併發送他的用戶名。服務器將回答一些狀態碼。在這個狀態下,我卡住了。我創建了套接字並連接到服務器。服務器顯示,它收到用戶名,但我的客戶端沒有得到任何答案。TCP Socket沒有接收到數據c

#define MAX_USERNAME 11 
#define MAX_MSG_SIZE 1001 
#define SERVERIP  "localhost" 
#define SERVERPORT  5000 

[...]someFunctions()[...] 

int _tmain(int argc, char* argv[]) 
{ 
    char defaulthost[] = "localhost"; 
    hostent     *host; 
    protoent    *protocol; 
    SOCKADDR_IN    server_addr; 
    SOCKET     socket_d; 
    unsigned short   port; 
    char     *hostname; 
    int      n; 
    int      c; 
    int      connectCode; 
    char username[MAX_USERNAME]; 
    char message[MAX_MSG_SIZE]; 

    long      conn; 
    long      msgSize; 

    [...] 
    //read in username 
    [...] 

    // Connect to Server 

    RNP_Init(); // intializes winsock 

    memset(&server_addr, 0, sizeof(server_addr));  
    server_addr.sin_family = AF_INET;     
    port = SERVERPORT;         
    if (port > 0){    
     server_addr.sin_port = htons(port);    
    } 
    else {            
     fprintf(stdout,"Ungültige Portnummer\n"); 
     RNP_Cleanup(); 
     exit(EXIT_FAILURE); 
    } 

    hostname = defaulthost; 
    conn = getAddress(hostname,&server_addr); 
    if(conn == SOCKET_ERROR){ 
     fprintf(stdout,"IP fuer %s nicht aufgeloest",hostname); 
     RNP_Cleanup(); 
     exit(EXIT_FAILURE); 
    } 
    else{ 
     fprintf(stdout,"IP aufgeloest"); 
    } 

    socket_d = socket(AF_INET, SOCK_STREAM, 0); 
    if (socket_d == INVALID_SOCKET) { 
     RNP_Error(RNP_E_SOCK, "Fehler bei Generierung des Sockets\n"); 
     RNP_Cleanup(); 
     exit(EXIT_FAILURE); 
    } 
    else { 
     fprintf(stdout, "Socket erfolgreich erstellt!\n"); 
    } 

    conn = connect(socket_d, (SOCKADDR*)&server_addr,sizeof(SOCKADDR)); 

    if(conn==SOCKET_ERROR){ 
     printf("Fehler: connect gescheitert, ERROR: %d\n", WSAGetLastError()); 
     RNP_Cleanup(); 
     fprintf(stdout,"Taste druecken zum beenden\n"); 
     getch(); 
     exit(EXIT_FAILURE); 
    } 
    else{ 
     printf("Verbunden mit Server!!\n"); 
    } 

    while(conn != SOCKET_ERROR) { 
     fprintf(stdout,"Sende Nutzernamen...\n"); 
     send(socket_d, username, strlen(username), 0); 
     fprintf(stdout,"Username gesendet: %s mit der Laenge %d\n", username, strlen(username)); 

     msgSize = recv(socket_d,message,1001,0); 
     if(msgSize==0){ 
      fprintf(stdout,"Verbindung vom Server getrennt\n"); 
      break; 
     } 
     if(msgSize==SOCKET_ERROR){ 
      fprintf(stdout,"Error: %d\n",WSAGetLastError()); 
      break; 
     } 
     message[conn]='\0'; 
     printf("Server antwortet: %s\n",message); 
    } 
[...] 
+2

您不應該假設整個響應將在一次調用recv()後收到。 TCP沒有消息邊界,服務器上的'send'和接收器上的'recv'之間沒有1對1的對應關係。 – Barmar

+1

您的應用程序協議需要某種方式來指示消息邊界,例如用戶名的末尾,以及服務器發送的狀態碼的結​​尾。 – Barmar

回答

2

的問題是在這裏:

message[conn]='\0';

如果conn等於0,你將無法 「看到」 的數據。 您不應該使用conn,而是使用msgSize,它包含接收字節數。

message[msgSize]='\0';

編輯:你應該照顧Barmar的建議的。