2017-09-07 5 views
0

Je suis assez nouveau dans la programmation réseau. J'ai écrit un simple serveur TCP non bloquant en utilisant winsock2 mais il se comporte bizarrement que je n'ai pu trouver aucun exemple dans les questions précédemment posées.Le serveur TCP non bloquant C++ ne peut pas envoyer un message avec plus d'octets qu'il n'en a reçu

Mon serveur peut uniquement envoyer un message avec autant d'octets que précédemment. Par exemple, si précédemment il a reçu un "rec_msg", quand j'essaye d'envoyer "message_to_send" il envoie seulement "message".

Je ne sais pas si cela a un effet mais le serveur est encapsulé avec une classe statique pure. Voici la fonction via un recieve et envoyer un message:

int TCPServer_Test::receiveMessage(){ 
    while(1) 
    { 
    memset(recvbuf, 0, DEFAULT_BUFLEN); 
    iResult = recv(ClientSocket, recvbuf, recvbuflen, 0); 
    int err = WSAGetLastError(); 
    int counter = 0; 
    if (iResult > 0) 
    { 
      std::cout << "Mesaj Alindi: " << recvbuf << std::endl; 
      break; 
    } 
    else if(err == WSAEWOULDBLOCK) 
    { 
      Sleep(200); 
      continue; 
    } 
    else if (iResult == 0){ 
    printf("Connection closing...\n"); 
     return -1; 
    } 
    else 
    { 
    printf("recv failed with error: %d\n", WSAGetLastError()); 
    closesocket(ClientSocket); 
    WSACleanup(); 
    assert(false); 
    } 
    } 
} 
void TCPServer_Test::sendMessage(char* Source){ 
    strncpy(recvbuf, Source, DEFAULT_BUFLEN); 

    iSendResult = send(ClientSocket, recvbuf, iResult, 0); 

    if (iSendResult == SOCKET_ERROR) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
    assert(false); 
    } 
    else if (iSendResult == 0) { 
     printf("send failed with error: %d\n", WSAGetLastError()); 
     closesocket(ClientSocket); 
     WSACleanup(); 
    assert(false); 
    } 
    else 
    { 
     printf("Bytes sent: %d\n", iSendResult); 
    } 
    memset(recvbuf, 0, sizeof(recvbuf)); 
} 

Je vous serais reconnaissant toute aide directement liée ou non.

Répondre

4

On dirait que ça arrive parce que vous utilisez iResult variable qui contient une quantité de données reçues au cours précédent recv appel lors de l'envoi des données au lieu de fournir la taille réelle des données à envoyer comme ceci:

size_t bytes_count_to_be_send = strlen(Source); 
iSendResult = send(ClientSocket, Source, bytes_count_to_be_send, 0); 

également remarquez qu'il n'y a aucun besoin réel de copier des données dans le tampon.

+1

Le code de réception suppose également que les données reçues sont à terminaison nulle mais cela n'est pas garanti. Il devrait utiliser la valeur de retour de 'recv' pour limiter la quantité de données écrites dans' std :: cout' –

+0

@RemyLebeau Une autre chose suspecte à propos du code 'recv' est que la taille de la mémoire tampon est d'abord exprimée en tant que' DEFAULT_BUFLEN' mais aussi 'recvbuflen'. – VTT

+0

@RemyLebeau Dans le code actuel il n'y a pas d'hypothèse de terminaison nulle, ce cout est une sorte de remplacement visant à obtenir une simplification mais merci beaucoup. –