Prob sock

cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006 - 25 août 2003 à 23:04
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006 - 26 août 2003 à 22:31
voilà, g commencé la prog des socks en vc++, mais rien ne transitte alors que la connexion semble être bien effectuée, voilà le code :

************************************************
Le serveur
************************************************

SOCKET sock;
SOCKET Rsock;
SOCKADDR_IN sin;
SOCKADDR_IN Rsin;
sock = socket(AF_INET,SOCK_STREAM,0);
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(6667);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));

char *msg = "test";
listen(sock, 0);
while(1)
{
int addrSize = sizeof(sin);
if(Rsock=accept(sock, (SOCKADDR *)&Rsin, &addrSize) != INVALID_SOCKET)
{
AfxMessageBox("Connecté");
// Fonctions à éxécuter sur le socket.
if(send(Rsock, msg, strlen(msg), 0) != SOCKET_ERROR){
closesocket(sock);
closesocket(Rsock);
WSACleanup();
exit(-1);
}
}
}

*************************************************
Le client
*************************************************

SOCKET sock;
SOCKADDR_IN sin;
char *buffer = new char[255];
buffer="vide";
sock = socket(AF_INET,SOCK_STREAM,0);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(6667);

connect(sock, (SOCKADDR *)&sin, sizeof(sin));
if(recv(sock, buffer, strlen(buffer), 0) != SOCKET_ERROR){
closesocket(sock);
WSACleanup();
AfxMessageBox(buffer);
}

*************************************************

Au niveau du serveur on a bien le le msgbox "Accepté", mais le send() génère l'erreur 'SOCKET_ERROR', donc forcément il ne se passe rien, le recv() du client génère aussi cette erreur.

Merci pour votre aide :-)

14 réponses

Anacr0x Messages postés 515 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 27 avril 2006 2
26 août 2003 à 15:06
Bon déja, coté client, c légé, aucune gestion d'erreur ni rien...
essaye avec ca :

SOCKET to_server_socket = 0;

WSADATA wsaData;     // faut toujours le fair en utilisant les sockets
 if( int err = WSAStartup( 0x0101, &wsaData ) )
     {
        char WSAStartError[1024];
        sprintf(WSAStartError,"WSAStartup failed... Error: %s", err);
        MessageBox(MainHandle, WSAStartError, "Erreur", MB_ICONERROR | MB_OK);
        return 0;
     }

 struct sockaddr_in  serverSockAddr;    // addresse de la socket
 struct hostent  * serverHostEnt;       // description du host serveur
 long hostAddr;                         // addr du serveur
     
 memset( &serverSockAddr, 0,sizeof( serverSockAddr ) );     // initialise a zero serverSockAddr
 // Converti l'adresse ip en entier long
 hostAddr = inet_addr( 127.0.0.1 );

 if( ( long ) hostAddr != ( long ) -1 )                  
    memcpy( &serverSockAddr.sin_addr, &hostAddr, sizeof( hostAddr ) );
 else                                                   // si on a donne un nom
   {
    serverHostEnt = gethostbyname( 127.0.0.1  );
    if ( serverHostEnt == NULL )
      {
       MessageBox(MainHandle, "Impossible d'utiliser le port 25 du serveur...\nVérifiez que vous êtes "
                              "bien connecté à internet ou bien changez de serveur", "Erreur", MB_ICONERROR | MB_OK);
       return 0;
      }
    memcpy( &serverSockAddr.sin_addr, serverHostEnt->h_addr, serverHostEnt->h_length );
   }

 serverSockAddr.sin_port = htons( 6667 );        // host to network port
 serverSockAddr.sin_family = AF_INET;            // AF_*** : INET=internet
 // Creation de la socket

 to_server_socket = socket( AF_INET, SOCK_STREAM, 0 );
 if( to_server_socket < 0)
   {
    MessageBox(MainHandle, "Echec creation socket client", "Erreur", MB_ICONERROR | MB_OK);
    return 0;
   }
                 
 // Requete de connexion
 if( connect( to_server_socket, ( struct sockaddr * ) &serverSockAddr, sizeof( serverSockAddr ) ) < 0 )
   {
    MessageBox(MainHandle, "Echec demande de connection", "Erreur", MB_ICONERROR | MB_OK);
    return 0;
   }


Si ca marche toujour pas, ca vient du serveur, j'coné moins les serveurs mais jregarderé ça quand même...

Et n'oublie pas qu'il ya des solution plus simple pour faire un serveur\client (http://www.cppfrance.com/article.aspx?ID=1875)
@+
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 18:05
Salut,
Place des WSAGetLastError(..) avant et apres le send(...) pour avoir + d'infos sur l'erreur.
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 18:55
Il me met assertion failure, aussi bien avant que après
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 19:03
Salut,

if(send(Rsock, msg, strlen(msg), 0) != SOCKET_ERROR){
closesocket(sock);
closesocket(Rsock);
WSACleanup();
exit(-1);}

ca serait pas plutot un ' == ' ?
car la lorsque tout va bien, pas d'erreur, tu fermes les 2 sockets et tu WSACleanup().
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 19:21
non, c'est bien !=, en fait lors d'une connexion le serveur envoie un message et puis se ferme (c vraiment juste pour essayer). Mais le message ne part jamais.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 19:27
Salut,
Ok j'avais pas compris ca comme ca.
Bon sinon il manque WSAStartup() dans le client et le serveur. (ca serait bien du style a generer une assersion failure).
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 19:39
en fait j'ai mis :

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);

Dans le InitInstance() de mon projet.

C'est peut-être pas la bonne place?
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 19:44
Salut,
Essaye de le mettre juste avant l'appel de la fonction socket(..).
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 19:44
hum, même au lancement de l'application l'erreur est la même! Avant même d'avoir fait quoi que ce soit...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 19:48
Je pense que ca viens de WSAStartup(..)
Si la dll winsock n'est pas initialisée, WSAGetLastError(..) retourne directement une erreur je pense.
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 20:05
Bon, j'ai tout refait en mode console (plus clair). Je lance le serveur, pas de prob, je lance le client et là le serveur me met "erreur envoie".

voilà le nouveau code :

***********************************************
serveur
***********************************************
#include "stdafx.h"
#include "winsock2.h"

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[])
{
printf("Serveur de test\n");

SOCKET sock;
SOCKET csock;
SOCKADDR_IN sin;
SOCKADDR_IN csin;
char *buffer=new char[255];

buffer="Vous etes connectes\r\n127.0.0.1 sur le port 50\r\n\r\n";

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
sock = socket(AF_INET,SOCK_STREAM,0);

sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_family = AF_INET;
sin.sin_port = htons(50);
bind(sock, (SOCKADDR *)&sin, sizeof(sin));

listen(sock, 0);
while(true)
{
int addrSize = sizeof(sin);
if(csock=accept(sock, (SOCKADDR *)&csin, &addrSize) != INVALID_SOCKET)
{
// Fonctions à éxécuter sur le socket.
csock=send(csock, buffer, sizeof(buffer), 0);
if(csock != SOCKET_ERROR){
printf("Envoie reussie\n");
// closesocket(sock);
// WSACleanup();
// exit(-1);
}
else{
printf("Echec de l'envoie\n");
}
}
}

return 0;

}

************************************************
client
************************************************

#include "stdafx.h"
#include "winsock2.h"

#pragma comment(lib, "ws2_32.lib")

int main(int argc, char* argv[])
{
printf("Client de test\n");

char *buffer = new char[255];

SOCKET sock;
SOCKADDR_IN sin;

WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
sock = socket(AF_INET,SOCK_STREAM,0);

sin.sin_addr.s_addr = inet_addr("127.0.0.1");
sin.sin_family = AF_INET;
sin.sin_port = htons(50);

connect(sock, (SOCKADDR *)&sin, sizeof(sin));

if(recv(sock, buffer, strlen(buffer), 0) != SOCKET_ERROR){
printf("Réception ok : %c\n",buffer);
//closesocket(sock);
//WSACleanup();
}
else{
printf("Erreur reception\n");
}

return 0;
}

Merci pour ton aide en passant ;-)
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
26 août 2003 à 21:18
Salut,
J'ai testé et ca marche chez moi

Il faut appeller send(...) seulement si on est sur que csock est bien valide, cad dans le bloc d'instruction qui est executé si csock != SOCKET_ERROR.

while(true)
{
int addrSize = sizeof(sin);
if(csock=accept(sock, (SOCKADDR *)&csin, &addrSize) != INVALID_SOCKET)
{
// Fonctions à éxécuter sur le socket.
if(csock != SOCKET_ERROR){
send(csock, buffer, sizeof(buffer), 0);
printf("Envoie reussie\n");
// closesocket(sock);
// WSACleanup();
// exit(-1);
}
else
{
printf("Echec de l'envoie\n");
}
}
}

Au passage, send(...) retourne le nombre d'octet envoyés, donc ecrire:
csock=send(csock, buffer, sizeof(buffer), 0);
est tout simplement faux.
A la prochaine utilisation de csock il y aura une erreur car le socket handle ne sera plus valide.
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 22:15
Ok ça marche impec, merci pour ta patience!
0
cs_epoc Messages postés 87 Date d'inscription mardi 28 mai 2002 Statut Membre Dernière intervention 25 octobre 2006
26 août 2003 à 22:31
Merci aussi pour ton aide, mais j'ai préféré corriger mon code, thanks ;-)
0
Rejoignez-nous