begin process at 2012 05 29 22:02:20
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Réseau & Internet

 > 

probleme de send en C avec socket


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

probleme de send en C avec socket

mercredi 18 avril 2007 à 14:20:33 | probleme de send en C avec socket

thorn74

bonjour je suis actuellement en IUT info et G un  projet a faire mais je bloque je doit fair eun petit programme ou lorsqu'un ordinateur se connecte au serveur le serveur doit lui renvoyer un msg quelconque apre plusieur test j'ai finalement trouver que le probleme venait du send du coter serveur et donc par consequent le recv du coter client ne marche pas non plus donc si quelqu'un peut m'aider un peut

voici mon code du coter serveur


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 59999

int main(int argc, char *argv[])
{
    char * phrasep;
    char phrase;
    printf("quelle phrase voulez-vous envoyer?\n");
    scanf("%s",&phrase);
    phrasep=malloc(sizeof(phrase));
  WSADATA wsaDat;
   SOCKET ConnectSocket, Client;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   SOCKADDR_IN csin;
   int sin_size=sizeof(csin);
   char * ch = "connexion serveur Ok.";
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );
  
   if(WSAStartup(MAKEWORD(2,0),&wsaDat) != 0) //makeword(2.0) specifie la version de winsock utilisé
       return EXIT_FAILURE;
 
  // ouverture socket
  SOCKET sock;
  SOCKADDR_IN sin;
  //sin.sin_addr.s_addr etant donnée que nous somme sur le serveur on ne met pas
  //d'adresse car le serveur n'a pas a connaitre l'adresse des clients
  sin.sin_addr.s_addr = htonl(INADDR_ANY);
  //sin.sin_family indique le type de socket utilisé pour le net on utilise le plus souvent AF_INET
  sin.sin_family = AF_INET;
  //sin.sin_port definie le numero du port a utilisé pour communiquer avec le client
  sin.sin_port        = PORT;
  // la creation réelle du socket ce fait ici il faut rapeller le type de socket utiliser comme au prealable
  //SOCK_STREAM veut dire ouvrent une conn entre les 2 ordinateurs directe et pourra ensuite envoyer les paquets
  // que vous désirez, tandis que le SOCK_DGRAM envoie un paquet directement à la destination sans faire d'accept() ou de connect()
  sock = socket(AF_INET,SOCK_STREAM,0);
  //commande qui permet de rattacher le socket directement au port et a l'adresse configurer au prealable
  bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  printf("salut comment ca va ");
  system("pause");

 
 
   struct sockaddr_in service;
  // spécification de la partie locale
  
  // liaison à la socket
  
 
  // boucle d'attente de connexion
  // connexion et envoi du message au client
    listen(sock, 3); //limitation du nombre de connexions à 3
    int val = 0; //variable qui va stocké la valeur de retour qui nous indiquera si la connection est bien accepter

    val = accept(sock, (SOCKADDR *)&sin, &sin_size);
    if(val != INVALID_SOCKET)
    {
           // Fonctions à éxécuter sur le socket.
           int valid=send(sock,phrasep ,5, 0); 
           printf("%i",valid);
           system("pause");

}
    
   WSACleanup();
   return EXIT_SUCCESS;
}


et mon code du coter client :


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define PORT 59999

int main(int argc, char *argv[])
{
    char msg;
    char *servIP;
    char cadr;
    printf("a quelle adresse ip voulez vous vous connectez?");
    scanf("%s",&cadr);
    servIP = &cadr;
    WSADATA wsaDat;
   SOCKET Sock, Client;
   STARTUPINFO si;
   PROCESS_INFORMATION pi;
   SOCKADDR_IN s_in;
   int s_in_size, n,valid;
   char buff[255];
  
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );
  
   if(WSAStartup(MAKEWORD(2,0),&wsaDat) != 0)
       return EXIT_FAILURE;

           // creation socket
           // spécification adresse IP et port serveur
          // connexion au serveur
          // reception message et affichage


      // ouverture socket
  SOCKET sock;
  SOCKADDR_IN sin;
  //sin.sin_addr.s_addr specifie l'adresse de connection
 
  sin.sin_addr.s_addr = inet_addr("127.0.0.1");
  //sin.sin_family indique le type de socket utilisé pour le net on utilise le plus souvent AF_INET
  sin.sin_family = AF_INET;
  //sin.sin_port definie le numero du port a utilisé pour communiquer avec le client
  sin.sin_port        = PORT;
  // la creation réelle du socket ce fait ici il faut rapeller le type de socket utiliser comme au prealable
  //SOCK_STREAM veut dire ouvrent une conn entre les 2 ordinateurs directe et pourra ensuite envoyer les paquets
  // que vous désirez, tandis que le SOCK_DGRAM envoie un paquet directement à la destination sans faire d'accept() ou de connect()
  sock = socket(AF_INET,SOCK_STREAM,0);
  //commande qui permet de rattacher le socket directement au port et a l'adresse configurer au prealable
  bind(sock, (SOCKADDR *)&sin, sizeof(sin));
  valid=connect(sock, (SOCKADDR *)&sin, sizeof(sin));
  printf("%i",valid);
  valid=recv(sock, buff, sizeof(buff), 0);
  printf("avant\n");
  printf("%s\n%i\n",buff,valid);
  printf("apres\n");
   closesocket(Sock); 
   WSACleanup();
   system("PAUSE");
   return EXIT_SUCCESS;
}

merci bien de votre aide

mercredi 18 avril 2007 à 18:12:06 | Re : probleme de send en C avec socket

aardman

Membre Club
Salut,
Coté serveur:
- il faut utiliser htons() pour remplir de le champ sin.sin_port de la structure sockaddr_in.
- la valeur de retour de accept n'indique pas simplement si l'operation a réussi ou pas, elle indique aussi le socket a utiliser pour communiquer avec le client qui vient de se connecter. il faut donc faire ton send en utilisant le socket 'val'.
Coté client:
- pas besoin de faire de bind() avant un connect().

voila pour les erreurs de socket que j'ai vu, mais il reste plein d'autres erreurs relatives au langage, comme ca par exemple:
char cadr;
scanf("%s",&cadr);


Cette discussion est classée dans : port, socket, sin, sock, sizeof


Répondre à ce message

Sujets en rapport avec ce message

[SOCKET]Tjrs le pb de recuperation du buffer recv() [ par enthaz ] Allez J me lance : ca fait des heures et des heures ke le newb ke je suischerche la solution :D un coté j ai un logiciel client ki envoie "coucou" sur Socket, quand tu nous tiens ... [ par enthaz ] Allez J me lance : ca fait des heures et des heures ke le newb ke je suischerche la solution :D un coté j ai un logiciel client ki envoie "coucou" sur Probleme de socket (envoi) [ par SnOOpss ] Salut !!!Voila g realisé nn programme pour m'envoyer des socket a moi meme ( c pr tester) *********Client******** #include #pragma comment(lib, "ws2_3 [C] Scanner de port utilise socket version linux [ par firemax ] Salut :) J'ai une erreur de segmentation et je n'est pas la moindre idée d'ou ca peut venir :( Je n'est aucun warning lors de la compilation mais l Socket en C [ par RM50Man ] WSADATA ws;                    WSAStartup(MAKEWORD(2,0), &ws);              &n client serveur echange de donne [ par bapdur ] voici la version dun client et dun serveur que je fais pour un jeu mais les donnes son envoyer en continu jaimerais aire en sorte que si je tape un ca probleme boucles mutliple avec les sockets [ par miki42 ] Bonjour a tous voila j'ai pa le choix,deja une semaine que je mord la langue pour trouver dou vient mon probleme mais rien y fait suit obliger de fari les socket [ par ben83510 ] Bonjour, Je me suis lancer dans le tutoriel sur les socket. J arrive a effectuer la connexion lorsque j execute le serveur et le client sur mon pc.Ma communication serveur c et client java [ par andoid ] Bonjour Je voulais savoir commment on peut faire communiquer un serveur C et un cleint java avec les sockets voici juste un petit serveur qui dit bonj erreur bind: Address already in use [ par andoid ] Bonjour j'ai mon programme suivant qui marche et je suis en route pour creer mon serveur pour l'instant le client qui se connecte je lui envoi juste l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,933 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales