win sock client
-
Hallo ich habe ja gestern von jemandem eine Source Code für den win sock client bekommen.
Jetzt hab ich den Source Code etwas verändert und ein paar sachen rausgemacht wie z.b. Daten Senden und so ich will halt erst mal nur das mit dem Verbinden alleine hin bekommen ....
Hier ist der Originale Source Code:
#include <winsock2.h> #include <stdio.h> #include <iostream> #include <string> #include <conio.h> #include <sstream> using namespace std; //Prototypen int startWinsock(void); int main() { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; char buf2[4096]; string ip; ip=""; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } printf("bitte geben sie die ip ein:\n"); cin>>ip; // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr(ip.c_str()); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Verbunden mit 127.0.0.1..\n"); } for(int i=0;i<=sizeof(buf)-5;i++){buf[i]='1';} string temp; // Daten austauschen while(rc!=SOCKET_ERROR) { printf("\nZeichenfolge eingeben [max 256]: "); cin>>ip; /*ip=replace(ip," \0"," "); cout<<ip;*/ //for(int i=0; i<=20;i++){ //temp=ip.substr(i,256); int pos=ip.find(0x20); if(pos!=string::npos){ip[pos]='&';} cout<<pos<<":"<<ip; getch(); send(s,ip.c_str(),20,0); //send(s,buf,256,0); //} rc=recv(s,buf,256,0); if(rc==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(rc==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } buf[rc]='\0'; printf("\nServer antwortet: %s\n",buf); } closesocket(s); WSACleanup(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }Hier mein veränderter
#include <winsock2.h> #include <stdio.h> #include <iostream> #include <string> #include <conio.h> #include <sstream> using namespace std; //Prototypen int startWinsock(void); int main() { long rc; SOCKET s; SOCKADDR_IN addr; char buf[256]; char buf2[4096]; string ip; ip=""; // Winsock starten rc=startWinsock(); if(rc!=0) { printf("Fehler: startWinsock, fehler code: %d\n",rc); return 1; } else { printf("Winsock gestartet!\n"); } // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Socket erstellt!\n"); } printf("bitte geben sie die ip ein:\n"); cin>>ip; // Verbinden memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten addr.sin_family=AF_INET; addr.sin_port=htons(12345); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr(ip.c_str()); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError()); return 1; } else { printf("Verbunden mit 127.0.0.1..\n"); } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }bei meinem veränderten bekomme ich aber diese Fehlermeldungen:
[C++ Fehler] Unit1.cpp(72): E2141 Fehler in der Deklarationssyntax
[C++ Fehler] Unit1.cpp(79): E2139 In Deklaration fehlt ;
[C++ Fehler] Unit1.cpp(79): E2134 Abschließendes } fehltaber ich find den Fehler nicht

-
Dir müsste doch schon an der Einrückung auffallen, dass die abschließende geschweifte Klammer der main-Funktion fehlt.
-
oh jo thx.
Ich muss mir mal angewöhnen genauer zu gucken

-
Ganz am ende steht dort ja:
int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }kann man das auch einfach so machen:
int startWinsock(void) { WSADATA wsa; return 0; }weil funktionieren tut das Programm dann auch oder gibt es dann da irgendwelche nachteile?
-
WSAStartup muss aufgerufen werden (bevor von der Windows Socket Funktionalität gebrauch gemacht wird).
WSACleanup auch (wenn die Windows Socket Funktionalität nicht mehr benötigt wird.)
-
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