2014-01-29 3 views
0

У меня возникла задача создать Чат для чата. Сервер указан и код неизвестен (только получил исполняемый файл). Клиент/сервер связывается через 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';

EDIT: Вы должны заботиться о советах Barmar «s.

Смежные вопросы