Witam, piszę sobie prosty serwerek oprarty na winsock, no i wszystko jest fajnie, kod się kompiluje, ale funkcja ‘bind’ zwraca wartość ‘INVALID_SOCKET’.
Witam, probuje napisac prosta aplikacje “serwera” w VC++ pod Windows, jednak podobnie jak kolega wyzej, mam problem z funkcja bind(). Nie chcialem zakladac kolejnego watku z tym problemem, dlatego pisze tutaj, jako ze jest jeszcze swiezy otoz funkcja bind zwraca mi kod bledu -1, powyzsze rozwiazanie nie skutkuje, wydaje mi sie ze moze to byc cos z portami, jednak proba zmian nie przyniosla zadnego rezultatu oto kod programu
#include
#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib")
using namespace std;
int main()
{
int m_port = 1040;
int odp;
WSAData wsdat;
if (WSAStartup(MAKEWORD(1,1),&wsdat)!= 0)
{
cout<
exit(1);
}
struct sockaddr_in odb;
odb.sin_family = PF_INET;
odb.sin_port = htonl(m_port);
odb.sin_addr.s_addr = inet_addr("128.110.10.1");
memset(&(odb.sin_zero),'\0', 8);
int soc = socket(PF_INET,SOCK_STREAM,0);
if (soc == -1)
{
cout<<"Blad przy tworzeniu socketa.."<
exit(1);
}
else
cout<<"Utworzono socket na porcie.. "<<"( "<
odp = bind(soc,(struct sockaddr *) &odb, sizeof(struct sockaddr_in));
if (odp == -1)
{
cout<<"Przypisanie adresu nie powiodlo sie.."<
exit(1);
}
else
cout<<"Przypisano adres.. "<<"( "<
// ...
// itd
// ...
closesocket(soc1);
WSACleanup();
getch();
}
Zamierzasz podłączać klientów tylko z adresu 128.110.10.1 ? Na ile wiem windows’y tego nie obsłużą, łącz że wszystkimi a na etapie accept - odrzucaj połączenia od innych klientów.
myslalem ze po wykonaniu bind() i wykonaniu cout zobacze jakis adres (serwera/odbiorcy), ktory wpisal sie do odb.sin_addr wlasnie takie mialem zalozenie, dlatego zaczalem pisac 1 aplikacje dla serwera, a potem dla klienta w sumie z gniazdami datagramowymi to bylaby ciekawa sprawa, mysle ze z tym tez sie pobawie, ale najpierw chcialbym to doprowadzic do ladu
Serwer po podłączeniu się pod port musi zacząć nasłuchiwanie, jeżeli jakiś klient spróbuje nawiązać połączenie (dopiero w tym momencie można sprawdzić IP klienta) to serwer musi odrzucić lub zaakceptować połączenie, dopiero kiedy (i jeżeli) serwer zaakceptuję połączenie, klient może próbować coś wysyłać.
W sin_addr serwera zawszę pozostanie htonl(INADDR_ANY) czyli “0.0.0.0”, na ile pamiętam można tam próbować wstawić maskę ale nigdy nie widziałem żadnego działającego kodu z takim maskowaniem.
wlasnie na poczatku porownywalem kody jedyne co sie nie zgadzalo to INADDR_ANY, bo chcialem przypisac adres z reki a nie da sie ustawic adresu serwera na jakis inny? bo widzialem kod do apikacji klienta i w niektorych bylo zawarte “podaj ip serwera”, potem “podaj port” i mozna bylo wpisac, wiec chyba nie zawsze musi byc 0.0.0.0? bo zalozmy jakbym chcial zeby dwa hosty (gniazda datagramowe) byly w tej samej sieci to musza miec zgodny adres sieciowy, jak w takim przypadku go ustawic?
Narazie pisze serwer dlatego pytam jak to jest z ustawianiem adresu serwera, bo widzialem ze po stronie klienta mozna wpisac IP, a na pewno nie kazdy wpisuje 0.0.0.0 udp narazie sobie odpuszcze, musze sie zajac tcp
Dla części klienta konieczne jest podanie IP serwera. Część klienta może prosić o nazwę serwera (zamiast IP), wtedy po nazwie najpierw odszukuje adres IP, czyli tak czy owak w końcu do utworzenia sokety potrzebny jest ten IP.
hmm…czyli zalozmy ustawiam ten adres serwera na INADDR_ANY czyli automatycznie 0.0.0.0, a nastepnie po stronie klienta po poleceniu “wpisz adres serwera” ktos wpisuje zalozmy 128.110.10.1 i jak maja sie wtedy polaczyc? zreszta najnizszy adres w IPv4 to 1.0.0.0 to nie rozumiem dlaczego on przyjmuje taka wartosc kalin93 masz moze swoj kod do klienta?
Tak, po stronie klienta wpisujesz 128.110.10.1 i klient się łączy do serwera podczas instrukcji bind. Zresztą nie musisz się wdawać w to jak to działa pod spodem aby program zaczął działać.