Witam. Jestem w trakcie pisania programu. Stworzyłem klienta i serwer w oparciu o bibliotekę Winsock. Jednak mam kilka problemów z tym projektem, mianowicie piszę w devc++ z wykorzystaniem WinApi i np. chciałem aby Winsock inicjalizując WSA robił to w osobnej bibliotece a tak się niestety nie da. Wywala mi przy kompilacji błędy. Wszystko się ładnie kompiluje kiedy wrzucę to do WinMain. Teraz następny problem. Kiedy wrzucam cały kod do winmain to nie wiem jak teraz zrobić żeby klient cały czas próbował połączyć się z serwerem. Wymyśliłem że zrobię kontrolkę(button) i wkleję do niej kod z funkcją connect ale chyba to nie wypaliło tzn. kiedy próbuję tego użyć to cały czas pokazuje mi się komunikat że się nie połączyło. Nie wiem też dokładnie jak skończyć ten program tak aby serwer wyświetlał wiadomość że klient się podłączył. Wkleję kod który udało mi się napisać jeżeli znajdziecie błędy to proszę o wskazanie. Będę na prawdę wdzięczny.
To jest kod, który znajduje się w programie "Klient":(wszystkie potrzebne zmienne czy obiekty są zainicjalizowane w bibliotece dołączonej do projektu)
/*WSA*/
error = WSAStartup( version, &wsaData );
/* check for error */
if ( error != 0 )
{
/* error occured */
return FALSE;
}
/* check for correct version */
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
/* incorrect WinSock version */
WSACleanup();
return FALSE;
}
/* WinSock has been initialized */
//Deklaracje
klient = socket( AF_INET, SOCK_STREAM, 0 ); //Tworzenia gniazda
host=gethostbyname("");
IP = inet_ntoa (*(struct in_addr *)*host->h_addr_list);
memset( &sin, 0, sizeof sin );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(IP);
sin.sin_port = htons(port);
WSAAsyncSelect(klient,hwnd,WM_USER,FD_CONNECT|FD_READ|FD_WRITE|FD_ACCEPT);
kod klienta, który dołączyłem do komunikatu
case WM_COMMAND:
result =connect(klient,(struct sockaddr *) &sin, sizeof(sin));
if (result == SOCKET_ERROR)
{
closesocket (klient);
MessageBox(NULL,"Nie po³¹czono.","NET",MB_OK);
WSACleanup();
}
else
{
result = send( klient, sendbuf, (int)strlen(sendbuf), 0 );
if (result == SOCKET_ERROR) {
MessageBox(NULL,"Nie wys³ano.","NET",MB_OK);
closesocket(klient);
WSACleanup();
}
}
break;
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
break;
case FD_READ:
break;
case FD_CONNECT:
break;
case FD_WRITE:
break;
}
I kod serwera:
/*WSA*/
error = WSAStartup( version, &wsaData );
/* check for error */
if ( error != 0 )
{
/* error occured */
return FALSE;
}
/* check for correct version */
if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 )
{
/* incorrect WinSock version */
WSACleanup();
return FALSE;
}
/* WinSock has been initialized */
nasluchujacy = socket( AF_INET, SOCK_STREAM, 0 );
memset( &sin, 0, sizeof(sin) );
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
rozmiar = sizeof(sin);
if ( bind(nasluchujacy,(struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR )
{
MessageBox(hwnd,"bind - b³¹d","b³¹d",MB_OK);
WSACleanup();
}
if (listen(nasluchujacy,SOMAXCONN)==SOCKET_ERROR)
{
MessageBox(hwnd,"error listen","ERROR",MB_OK);
WSACleanup();
}
WSAAsyncSelect(nasluchujacy,hwnd,WM_USER,FD_ACCEPT|FD_CONNECT|FD_READ|FD_WRITE);
I do tego dołączona jest lista komunikatów do przechwycenia. Kompletnie nie mogę się w tym połapać.
case WM_USER:
switch (WSAGETSELECTEVENT(lParam))
{
case FD_ACCEPT:
polaczony = accept(nasluchujacy,(struct sockaddr *)&sin, &rozmiar);
break;
case FD_READ:
recv(polaczony,odbiorcza,sizeof(odbiorcza),0);
break;
case FD_CONNECT:
break;
case FD_WRITE:
break;
}
Komunikaty te dołączyłem do listy komunikatów w programie. Będę wdzięczny za pomoc, jeśli ktoś jest w stanie mi pomóc i z chęcią to zrobi to proszę pisać na maila lub gg. Pozdrawiam serdecznie