win sock client
-
ah ok thx
-
Und was Grundlegendes, bitte kein C und C++ vermischen...

Ein Frohes Fest euch allen! :xmas2:
-
wofür sind diese beiden Zeilen:
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
memset(&addr,0,sizeof(SOCKADDR_IN));
Bei der 2ten Zeile steht ja dahinter alles auf 0 setzen aber was ist damit gemeint

-
Hat den keiner eine Antwort ?

-
Hi liederwams,
rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));Mit dieser Zeile wird die Verbindung mit dem Socket hergestellt.
s ist der Socket für die Verbindung.
(SOCKADDR)&addr* ist ein Zeiger auf die Socket-Struktur, die du zuvor peraddr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=inet_addr(ip.c_str());gesetzt hast. Damit sind genug Informationen für die Socket-Verbindung vorhanden.
sizeof(SOCKADDR) gibt lediglich die Größe der Struktur an.
Weiterführende Infos zu connect() hier: http://msdn2.microsoft.com/en-us/library/ms737625.aspxmemset(&addr,0,sizeof(SOCKADDR_IN));Die Funktion memset setzt einen gewissen Speicherbereich auf einen bestimmten Wert; in diesem Fall den Wert 0. Memset ist ein sehr effektiver Weg, ein Array oder in diesem Fall eine Struktur zu initialisieren.
Ich denke, dass es hier nur den Sinn hat, keine unvorhergesehenen Werte in der addr-Struktur zu haben, die eventuell stören könnten.
Wenn du mehr über memset wissen wills, kannst du dir das hier anschaun: http://www.cppreference.com/stdstring/memset.htmlBin zwar kein Experte auf dem Socket-Gebiet, aber das ist halt was ich so weiß

-
ok thx :xmas1:
-
Warum muss in Zeile ein s stehen also ich meine damit das addr.s
addr.sin_addr.s_addr=inet_addr(ip.c_str());weil mein socket heisst ja A und nicht s
#include <winsock2> #include <iostream> using namespace std; int WinSock(void); int main() { long start; SOCKET A; SOCKADDR_IN addr; string ip; ip=""; // socker starten start=WinSock(); if(start!=0) { cout<<"Fehler Socket konnte nicht gestartet werden.\n",start; getchar(); return 1; } else { cout<<"Socket wurde Erfolgreich gestartet\n"; } //socket erstellen A=socket(AF_INET,SOCK_STREAM,0); if (A==INVALID_SOCKET) { cout<<"Fehler Socket konnte nicht erstellt werden\n",WSAGetLastError(); getchar(); return 1; } else { cout<<"Socket wurde Erfolgreich erstellt\n"; } // verbinden auf sever cout<<"Server IP eingeben: "; cin>>ip; addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=inet_addr(ip.c_str()); system("PAUSE"); return 0; } //--------------------------------------------------------------------------- int WinSock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
-
Weil irgendwer der Meinung war, das struct-Element als "sin_addr" zu bezeichnen

-
ok thx ^^
-
So ich hab den Client mal etwas verändert.
Das man die IP eingeben kann das funktioniert ja schon jetzt möchte ich aber auch auf einen beliebigen Port connecten.
SO hab ich es versucht aber dann bekomme ich folgende Fehlermeldungen:
[C++ Fehler] Unit1.cpp(56): E2034 Konvertierung von 'const char *' nach 'unsigned short' nicht möglich
[C++ Fehler] Unit1.cpp(56): E2342 Keine Übereinstimmung des Typs beim Parameter 'hostshort' ('unsigned short' erwartet, 'const char *' erhalten)addr.sin_family=AF_INET; addr.sin_port=htons(port.c_str()); addr.sin_addr.s_addr=inet_addr(ip.c_str());#include <winsock2> #include <iostream> using namespace std; int WinSocket(void); int main() { long startSock; SOCKADDR_IN addr; string ip,port; ip=""; port=""; SOCKET erstellterSocket; //socket starten startSock=WinSocket(); if (startSock!=0) { cout<<"Fehler\n",startSock; getchar(); return 1; } else { cout<<"socket gestartet\n"; } // socket erstellen erstellterSocket=socket(AF_INET,SOCK_STREAM,0); if(erstellterSocket==INVALID_SOCKET) { cout<<"Socket konnte nicht erstellt werden %d\n",WSAGetLastError; getchar(); return 1; } else { cout<<"socket erstellt\n"; } //verbinden zu server cout<<"IP Adresse eingeben: "; cin>>ip; cout<<"Port eingeben: "; cin>>port; addr.sin_family=AF_INET; addr.sin_port=htons(port.c_str()); addr.sin_addr.s_addr=inet_addr(ip.c_str()); startSock=connect (erstellterSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if (startSock==SOCKET_ERROR) { cout<<"Kann nicht connecten\n",WSAGetLastError(); system("PAUSE"); return 1; } else { cout<<"connectet\n"; } system("PAUSE"); return 0; } int WinSocket(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
-
Die Funktion htons erwartet einen unsigned short und keinen String als Übergabeparameter.
http://msdn2.microsoft.com/en-us/library/ms738557.aspx