BIND socket'a

0

Witam. Napisałem aplikację. Jest to serwer. Korzystam z Winsock. Wszystko pozamykałem w funkcjach żeby móc z tego potem z łatwością korzystać. Program kompiluje się bez błędów. Kiedy go uruchamiam to wygląda tak jakby szło wszystko dobrze dopóki nie dojdzie do bindowania. Wtedy pokazuje że nie może bindować i program już nic więcej nie zrobi. Ktoś ma pomysł co jest nie tak? Oto kod aplikacji:

HWND hwnd;  
SOCKET klient=INVALID_SOCKET,connected = INVALID_SOCKET;
WSADATA wsaData;
WORD version = MAKEWORD( 2, 0);
struct sockaddr_in sin;

void WSA_init(WORD version, WSADATA wsaData);
void WSA_init(WORD version, WSADATA wsaData)
{
    if (WSAStartup(version,&wsaData) != 0)
    {
    MessageBox(hwnd,"Nastąpił błąd inicjalizacji WSA.", "Error",MB_OK);
    WSACleanup();                               } 
    else
    {
    MessageBox(hwnd,"Inicjalizacja WSA przebiegła pomyślnie.", "Info",MB_OK);
    }
 
 
 }

void set_addr(sockaddr_in sin);
void set_addr(sockaddr_in sin)
{
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(2050);
 }
 

void create_listen(SOCKET klient);
void create_listen(SOCKET klient)
{
     
     klient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
     if (klient == INVALID_SOCKET)
     {
                MessageBox(hwnd,"Socket nie powstał.","Error",MB_OK);
                WSACleanup();
                }
     
 }

void bind_klient(SOCKET *klient, sockaddr_in *sin);
void bind_klient(SOCKET *klient, sockaddr_in *sin)
{
     if (bind(*klient,(struct sockaddr*)sin, sizeof(*sin)) == SOCKET_ERROR)
     {
     MessageBox(hwnd,"Bind - błąd.","Error",MB_OK);
     closesocket(*klient);
     WSACleanup();
                             }
 }

void listening(SOCKET klient);
void listening(SOCKET klient)
{
     if(listen(klient,SOMAXCONN) == SOCKET_ERROR)
     {
     MessageBox(hwnd,"Błąd nastąpił przy bindowaniu","Error",MB_OK);
     closesocket(klient);
     WSACleanup();
                                 }
 }

void accept_client(SOCKET connected);
void accept_client(SOCKET connected)
{
     if (connected == INVALID_SOCKET)
     {
                   MessageBox(hwnd,"Nie zaakceptowano połączenia.","Error",MB_OK);
                   closesocket(klient);
                   WSACleanup();
                   }
 }
0

Po co tworzysz drugi taki sam temat skoro ci za pierwszym razem wyjasnilem, ze wszedzie gdzie przesylasz do swoich funkcji strukture sockaddr_in to przesylaj TYLKO jej adres, a nie jak w set_addr ?

0

Sorry ale nie miałeś racji. Przynajmniej u mnie twoje rozwiązanie nic nie dało. Postanowiłem poszukać przykładów w internecie i znalazłem. Dla sprawdzenia skopiowałem żywcem kod dla serwera, pousuwałem kilka linijek żeby wszystko dopasować do WinApi i póki co usunąłem funkcje wysyłającą zdanie do klienta. Wszystko się skompilowało ale po uruchomieniu wysypuje się. Testuje aplikacje na jednym kompie podając ip które od razu zwraca wszystko z powrotem do tego samego kompa. Już nie mam pomysłu na WinSock. Niby proste a mi nie chce w ogóle działać.

0

Sorry, ale miał rację.
Zrób sobie taki test:

#include <stdio.h>
#include <winsock.h>
#include <conio.h>

void set_addr(sockaddr_in sin)
{
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(2050);
 }

int main()
{
	sockaddr_in test;
	set_addr(test);
	printf("%d\n",ntohs(test.sin_port));
	getch();
}

A zobaczysz, że dostajesz bzdury a nie 2050.
Przekazujesz strukturę przez wartość, a to oznacza że zmiany dokonane wewnątrz funkcji NIE WYCHODZĄ NA ZEWNĄTRZ.

1 użytkowników online, w tym zalogowanych: 0, gości: 1