2010-11-28 10 views
1

J'utilise le code affiché sur http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/126639f1-487d-4755-af1b-cfb8bb64bdf8 mais il n'envoie pas de données comme il est dit dans le premier message. Comment utiliser WSAGetLastError() comme indiqué dans la solution pour trouver ce qui ne va pas?Le client Winsock IRC se connecte mais n'envoie pas de données

J'ai essayé les suivantes:

void IRC::SendBuf(char* sendbuf) 

    { 

     int senderror = send(m_socket, sendbuf, sizeof(sendbuf), MSG_OOB);  

    if(senderror == ERROR_SUCCESS) { 
      printf("Client: The test string sent: \"%s\"\n", sendbuf); 
    } 
    else { 
      cout << "error is: " << senderror << ", WSAGetLastError: " << WSAGetLastError() << endl;  
    printf("Client: The test string sent: \"%s\"\n", sendbuf); 

    } 
    } 

Et la sortie est: l'erreur est: 4, WSAGetLastError: 0

Répondre

0

Vous évaluez l'adresse de WSAGetLastError au lieu de l'appeler. Vous devez ajouter des parenthèses pour appeler effectivement cette fonction:

void IRC::SendBuf(char* sendbuf) 
{ 
    int senderror = send(m_socket, sendbuf, strlen(sendbuf), 0); 
    if (senderror != SOCKET_ERROR) { 
     printf("Client: The test string sent: \"%s\"\n", sendbuf); 
    } else { 
     cout << "Error is: " << WSAGetLastError() << endl; 
    } 
} 

EDIT: La fonction retourne send() le nombre d'octets écrits, pas un code d'erreur. Vous devez tester la valeur de retour par rapport à SOCKET_ERROR, comme dans le code mis à jour ci-dessus. Dans votre cas, send() indique qu'il a envoyé avec succès 4 octets.

Comme vous l'avez noté ci-dessous, il n'envoie que 4 octets parce que c'est la taille de la variable sendbuf (c'est un pointeur, pas un tampon). Si la chaîne dans sendbuf est terminée par zéro, vous pouvez utiliser strlen() à la place. Si ce n'est pas le cas, vous devez probablement ajouter un paramètre de longueur de chaîne à IRC::SendBuf() lui-même.

+0

Maintenant, il imprime 0. Ne devrais-je pas obtenir l'un des codes énumérés ici? http://msdn.microsoft.com/en-us/library/ms740668%28VS.85%29.aspx#winsock.wsaeshutdown_2 – thorvald

+0

@thorvald, pas nécessairement. L'erreur "0" signifie "pas d'erreur", c'est-à-dire que tout s'est bien passé. Qu'est-ce qui vous fait penser que votre appel de socket précédent aurait échoué? –

+0

Parce qu'il n'a rien envoyé au serveur après la connexion, j'ai donc pensé que quelque chose s'était mal passé. J'utilise le code de cette page: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/126639f1-487d-4755-af1b-cfb8bb64bdf8 mais l'affiche originale n'a pas dit comment il a réparé le problème. – thorvald