Socket C et api

Signaler
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013
-
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011
-
Bonjour,

j'ai un petit prob avec un bot que j'essai de faire avec l'api et les sockets en C, pour l'instant on ne peux que cliquer sur le bouton connect et en gros on voit dans une editbox qui est desactiver tout ce que l'on recoit par le socket, le probleme est que le programme plante directement comme si le programme avait un probleme alors que tout compile bien et que si je prend la partie socket et que je la met dans un programme basic en mode console rien ne plante

voici le code
et o fait Joyeux Nowel a tous !!! :D

#include <winsock2.h>
#include <windows.h>
#include <stdio.h>
#include <string.h>

#include "resource.h"

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

INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE hinst;
SOCKET sock;

char ip[16];
char channel[300];
char nick[512];
char buffer[5000];
int port;

int WINAPI WinMain(HINSTANCE Instance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
hinst = Instance;
DialogBox(hinst,(LPCTSTR)IDD_DIALOG1, 0, DlgProc);
}

/******************************************************************************/
INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch(wParam)
{
//Connection
case ID_CONNECT:
GetDlgItemText(hwnd,IDC_EDIT1,ip,sizeof(ip));
GetDlgItemText(hwnd,IDC_EDIT4,channel,sizeof(channel));
GetDlgItemText(hwnd,IDC_EDIT5,nick,sizeof(nick));
port = GetDlgItemInt(hwnd,IDC_EDIT3,NULL,NULL);

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

sock = socket(AF_INET, SOCK_STREAM, 0);
sin.sin_addr.s_addr = inet_addr(ip);
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
connect(sock, (SOCKADDR *)&sin, sizeof(sin));

while(1)
{
recv(sock,buffer,sizeof(buffer),0);
SetDlgItemText(hwnd,IDC_EDIT1,buffer);
}
break;

//Envoyer message
case ID_ENVOYER:

break;

case ID_DECONNECT:
EnableWindow(GetDlgItem(hwnd, ID_CONNECT), TRUE);
EnableWindow(GetDlgItem(hwnd, ID_DECONNECT), FALSE);
closesocket(sock);
WSACleanup();
break;

}
break;
case WM_CLOSE:
EndDialog(hwnd,1);
closesocket(sock);
WSACleanup();
break;
}
return 0;
}

8 réponses

Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Ta boucle infinie n'a pas sa place dans la callback de ta dialogbox car elle bloque tout le thread.

Il faut utiliser soit les thread soit les sockets non bloquants (WSAAsyncSelect() par exemple..).
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

pourrait-je avoir un exemple stp de socket non blockant, tout le monde m'en parle mais je ne sais pas comment cela marche
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

on m'a aussi dis que l'on pouvais faire un Thread une fois pour ce genre de programme le probleme est que quand je met le code qui devrait etre dans ID_CONNECT dans

DWORD WINAPI fonction()
{
code
}

j'ai un packet d'erreur genre hwnd undeclared identifier, hinst undeclared Identifier, ceci connect without been initialized ...
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Dans cet ebook toutes les techniques utilisables avec winsock sont décrites:

http://betouchi.free.fr/doc_et_ebook/prog_reseau/network2.chm

les exemples:

http://betouchi.free.fr/doc_et_ebook/prog_reseau/exemples-network2.zip



Personnelement je trouve que la technique utilisant WSAAsyncSelect()
est de loin la meilleure de toute car elle s'implemente parfaitement
dans un prog graphique win32 (et tu n'a pas besoin de gerer plusieurs
threads).

Pour ton probleme de thread, un thread est une fonction comme une autre
sauf qu'elle est executée parallelement au reste du code. Si tu
utilises un HWND quelque part dans cette fonction, il faut qu'il soit
déclaré/initialisé quelque part dans la fonction (ou bien qu'il soit
global).
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

le probleme c'est de savoir quoi mettre dans la fonction WSAAsyncSelect()

en fait j'bloque sur un truc, ma fonction actuellement donne ceci
WSAAsyncSelect(sock,hwnd,?,?)

sachant que je sais que le 3eme doit etre un unsigned int et l'aute :s j'en sais rien... bref comment faire un socket non bloquant facilement
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Si je te dis que le troisieme parametre c'est le message qui
sera envoyé a ta fenetre et que le 4eme parametre sont les flags des
evenements à notifier (FD_CLOSE, FD_READ, etc..) cela ne t'avancera pas
beaucoup.

C'est pour ca que je t'ai donné l'url de l'ebook plus haut, ca me
semble vraiment indispensable avant d'utiliser les sockets sous
windows...
Messages postés
706
Date d'inscription
mercredi 17 novembre 2004
Statut
Membre
Dernière intervention
29 septembre 2013

ok j'vais prendre mon temps pour y apprendre et essayer de comprendre tout ceci,

merci.
.
Messages postés
627
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
24 juillet 2011

aardman> chez moi le fichier .chm affiche des oages blanches...