SOCKET Client/Server App. Lesen und schreiben
-
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