2014-01-29 66 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的建议的。