SOCKET Client/Server App. Lesen und schreiben
-
Hallo zusammen,
ich versuch grade eine Client/Server Application zu schreiben mit Sockets.
Mein server läuft schon. (Kann aber auch nur empfangen)
so, nun zu meinem Client:
int startWinsock(void); rc=startWinsock(); //Prüfen ob WinSocket gestartet ist if(rc != 0) { ListBox1->Items->Add("Fehler: StartWinsock"); } else { ListBox1->Items->Add("Winsock gestartet"); } //Socket erstellen SocketWR=socket(AF_INET,SOCK_STREAM,0); if(SocketWR==INVALID_SOCKET) { ListBox1->Items->Add("Fehler: Socket konnte nicht erstellt werden"); } else { ListBox1->Items->Add("Socket wurde erstellt!"); } //Verbindung zu localhost:12345 memset(&addr, 0,sizeof(SOCKADDR_IN)); //alles auf 0 setzen addr.sin_family=AF_INET; addr.sin_port=htons(12345); //Port bestimmen addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //localhost rc=connect(SocketWR,(SOCKADDR*)&addr,sizeof(SOCKADDR)); // rc=bind(SocketWR,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { ListBox1->Items->Add("Fehler: Connect gescheitert"); } else { ListBox1->Items->Add("Verbindung zu localhost!"); } //usw.Na ja das Probelm ist hier :
mit :
rc=connect(SocketWR,(SOCKADDR*)&addr,sizeof(SOCKADDR));kann ich schreiben sprich mit dem Socket schreiben.
mit :
rc=bind(SocketWR,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));kann ich lesen.
Aber wie mach ich das mein Socket beides kann. Wenn ich 2 Sockets in einer Application machen, gibts immer Probleme
Bitte um Tipps, Help

mfg
|23|
-
|23| schrieb:
rc=bind(SocketWR,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));kann ich lesen.
falsch
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/bind_2.aspmit recv empfängt man
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.aspbeispiele:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/getting_started_with_winsock.asp
http://www.c-worker.ch/
-
ohh ja was so nen Fußballspiel am Wochenende machen können

Hast natürlich vollkommen recht.
Aber hab da noch nen Problem will das ganze Test aber das will ned so richtige mein server (dos) gibt sofot wenn jemand was an ihm schreib:
if(rc==0 || rc==SOCKET_ERROR) { printf("Client %d hat die Verbindung geschlossen\n",i); closesocket(clients[i]); // socket schliessen clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben } else { buf[rc]='\0'; printf("\nClient %d: %s\n\t",i,buf); send(clients[1],buf,strlen(buf),0); }sprich er schick es an alle Client zurück..
Gut das geht auch wunderbar. soo jetzt will ich noch prüfen ob es auch ankommt:
ich mal das so:
while(rc!=SOCKET_ERROR) { ZeroMemory(bufferWrite,256); rc=recv(SocketWR,bufferWrite,256,0); ListBox1->Items->Add(bufferWrite); }Aber mach ich das stürtzt mein Programm ab, was heisst stürtzt aber aber es macht nix mehr weiter...
-
du hängst ja auch in ner schleife bis ein fehler passiert

-
Das ist ja vollkommen richtig damit will ich erreichen das immer alles angefangen wird was vom server gesendet wird..
-
Ob ich es in eine Schleife packe oder nicht:
er bleibt immer hier stehehn : rc=recv(sw,buf,256,0);
-
msdn schrieb:
If no incoming data is available at the socket, the recv call blocks and waits for data
benutz mal dir forensuche --> blocking socket oder nonblocking socket
-
miller_m schrieb:
msdn schrieb:
If no incoming data is available at the socket, the recv call blocks and waits for data
benutz mal dir forensuche --> blocking socket oder nonblocking socket
Ich denke mal eher der Server hat aufgelegt. SOCKET_ERROR ist -1, der rc ist aber 0, wenn der Server auflegt.
MfG
RB
-
rückgabewerte sind sowieso immer zu checken. und wenn nötig
GetLastError(), in diesem Fall WSAGetLastError(), abzufragen

-
Das kann doch nicht mein problem sein, oder?
den wenn ich nen anderen Client öffnen klann ich weiter auf den Server schreiben und erbekommt auch alles blos mien andere Client der die Funktion sprich die Schleife zum empfängen hat bekommt von Server nix obwohl der was schickt.
Hier etwas code:
Server:
#define MAX_CLIENTS 10 int startWinsock(void); int main() { char buf[256]; ZeroMemory(buf, 256); long rc; SOCKET acceptSocket; SOCKADDR_IN addr; //SOCKET connectedSocket; int i; FD_SET fdSet; SOCKET clients[MAX_CLIENTS]; rc=startWinsock(); //Prüfen ob WinSocket gestartet ist if(rc != 0) { printf("Fehler: StartWinsock, code: %d\n", rc); } else { printf("Winsock gestartet \n"); } //Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); if(acceptSocket==INVALID_SOCKET) { printf("Fehler: Socket konnte nicht erstellt werden, Fehler code: %d\n", WSAGetLastError()); return 1; } else { printf("Socket wurde erstellt!\n"); } memset(&addr, 0,sizeof(SOCKADDR_IN)); //alles auf 0 setzen addr.sin_family=AF_INET; addr.sin_port=htons(12345); //Port bestimmen addr.sin_addr.s_addr=INADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); if(rc==SOCKET_ERROR) { printf("Fehler: bind, fehler code: %d\n", WSAGetLastError()); return 1; closesocket(acceptSocket); WSACleanup(); } else { printf("Socket an Port 12345 angebunden\n"); } rc=listen(acceptSocket,10); if(rc==SOCKET_ERROR) { printf("Fehler: Listen, fehler code: %d\n", WSAGetLastError()); return 1; closesocket(acceptSocket); WSACleanup(); } else { printf("acceptSocket (Server) ist im Listen modus\n"); } for(i=0;i<MAX_CLIENTS;i++) { clients[i]=INVALID_SOCKET; } while(1) { FD_ZERO(&fdSet); // Inhalt leeren FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufügen // alle gültigen client sockets hinzufügen (nur die die nicht INVALID_SOCKET sind) for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]!=INVALID_SOCKET) { FD_SET(clients[i],&fdSet); } } rc=select(0,&fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben if(rc==SOCKET_ERROR) { printf("Fehler: select, fehler code: %s\n",WSAGetLastError()); return 1; } // acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat) if(FD_ISSET(acceptSocket,&fdSet)) { for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { clients[i]=accept(acceptSocket,NULL,NULL); printf("Neuen Client angenommen (%d)\n",i); break; } } } // prüfen wlecher client sockets im fd_set sind for(i=0;i<MAX_CLIENTS;i++) { if(clients[i]==INVALID_SOCKET) { continue; // ungültiger socket, d.h. kein verbunder client an dieser position im array } if(FD_ISSET(clients[i],&fdSet)) { rc=recv(clients[i],buf,256,0); if(rc==0 || rc==SOCKET_ERROR) { printf("Client %d hat die Verbindung geschlossen\n",i); closesocket(clients[i]); // socket schliessen clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben } else { buf[rc]='\0'; printf("\nClient %d: %s\n\t",i,buf); send(clients[1],buf,strlen(buf),0); } } } }Client:
ZeroMemory(buf, 256); startWinsock(); rc=startWinsock(); //Prüfen ob WinSocket gestartet ist if(rc != 0) { ListBox1->Items->Add("Fehler: StartWinsock"); } else { ListBox1->Items->Add("Winsock gestartet"); } //Socket erstellen sw=socket(AF_INET,SOCK_STREAM,0); if(sw==INVALID_SOCKET) { ListBox1->Items->Add("Fehler: Socket konnte nicht erstellt werden"); //return 1; } else { ListBox1->Items->Add("Socket wurde erstellt!"); } //Verbindung zu localhost:12345 memset(&addr, 0,sizeof(SOCKADDR_IN)); //alles auf 0 setzen addr.sin_family=AF_INET; addr.sin_port=htons(12345); //Port bestimmen addr.sin_addr.s_addr=inet_addr("127.0.0.1"); //localhost rc=connect(sw,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { ListBox1->Items->Add("Fehler: Connect gescheitert"); } else { ListBox1->Items->Add("Verbindung zu localhost!"); }
-
keiner ne idee
ich hab nun noch:
connectedSocket=accept(sw,NULL,NULL);rein gepackt aber irgendwie will das ganze nicht

Hier bleibt er stoppen:
rc=recv(sw,buf1,256,0);
-
müsste es nicht so aussehen
rc=recv(connectedSocket,buf,256,0);schau dir doch die tutorials auf www.c-worker.ch an
bsp:
http://www.c-worker.ch/tuts/socksrv.c
http://www.c-worker.ch/tuts/sock.c
-
miller_m schrieb:
müsste es nicht so aussehen
rc=recv(connectedSocket,buf,256,0);schau dir doch die tutorials auf www.c-worker.ch an
bsp:
http://www.c-worker.ch/tuts/socksrv.c
http://www.c-worker.ch/tuts/sock.cSoll ich lachen oder weinen ?
Es ist doch egal ob mein SOCKET sw heisst oder connectedSocket
und ob mein Buffer buf1 und nicht buf heisst.. das tut doch nix zur sache.
-
|23| schrieb:
Soll ich lachen oder weinen ?
Es ist doch egal ob mein SOCKET sw heisst oder connectedSocket
und ob mein Buffer buf1 und nicht buf heisst.. das tut doch nix zur sache.willst du mich jetzt verarschen? natürlich ist egal wie deine variablen nennst (depp1 und depp2), aber wenn du die links nicht liesst ist das nicht mehr mein problem
glaubst du ich / wir knallen dir nen kompletten quellcode und du kannst dann "programmieren".ok noch einmal
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.aspmsdn schrieb:
The recv function receives data from a connected or bound socket.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/recv_2.asp
gibt einen socket zurück
der in deinem fall "connectedSocket"
sachen gibst und was sagt uns dies
siehe recv