POSIX Thread mit Sockets
-
hallo leute
ich möchte ein chat programm mit Pthreads schreiben.Nun ist mein Problem dass mein Client Programm nichts vom Server empfängt oder nicht ausgibt. Außerdem kommt die auforderung zum einegben nicht
Server Code:
// ********************** // Server Programm // ********************** #include <windows.h> #include <winsock2.h> #include <stdio.h> int startWinsock() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } int main() { printf ("***********************\n"); printf ("****Server Programm****\n"); printf ("***********************\n"); long error; // Socket s erstellen SOCKET acceptSock; // Winsock initialisieren error = startWinsock (); if ( error != 0 ) { printf("Fehler: startWinsock, fehler code: %d\n", error ); } else { printf("Winsock erfolgreich gestartet!\n"); } //Socket starten acceptSock=socket(AF_INET,SOCK_STREAM,0); if (acceptSock==INVALID_SOCKET) { printf ("Fehler: Socket konnte nicht erstellt werden Fehlercode: %d\n" , WSAGetLastError()); } else { printf ("Socket erfolgreich erstellt!\n"); } //Socket binden struct sockaddr_in addr; memset (&addr,0,sizeof(addr)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=ADDR_ANY; error = bind (acceptSock,(SOCKADDR*)&addr,sizeof(addr)); if (error==SOCKET_ERROR) { printf ("Fehler: bind, fehler code: %d\n",WSAGetLastError()); } else { printf ("Socket erfolgreich gebunden!\n"); } //acceptSock in listen Modus setzten error = listen ( acceptSock,10); if (error==SOCKET_ERROR) { printf ("Fehler: listen, fehler code: %d\n",WSAGetLastError()); } else { printf ("Socket ist im listen Modus!\n"); } //Accept Funktion SOCKET connectedSocket; connectedSocket = accept (acceptSock,NULL,NULL); if(connectedSocket==INVALID_SOCKET) { printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); } else { printf("Neue Verbindung wurde akzeptiert!\n"); } char test[300] = "hallo Client"; char test1[300] = "wie geht es dir?"; send (connectedSocket,test,sizeof (test),0); send (connectedSocket,test,sizeof (test1),0); closesocket(connectedSocket); WSACleanup(); system("PAUSE"); return 0; }
Client Programm:
// ********************** // Client Programm // ********************** #include <windows.h> #include <winsock2.h> #include <stdio.h> #include <pthread.h.> int startWinsock() { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); } [b] //Thread 1 void *empfangen (SOCKET *s) { printf ("Thread 2 erfolgreich gestartet!\n"); long error; int bytes; char buffer [300]; while ( error != SOCKET_ERROR ) { //Nur Ausgabe wenn was empfangen wurde if ((bytes = recv((SOCKET)*s, buffer, sizeof(buffer), 0)) > 0) { printf ("Client: %s\n",buffer); } if(error==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(error==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } } } //Thread 2 void *senden (SOCKET *s) { printf ("Thread 2 erfolgreich gestartet!\n"); long error; char buffer [300]; while ( error != SOCKET_ERROR ) { gets(buffer); error = send((SOCKET)*s,buffer,strlen(buffer),0); printf ("Client: %s\n",buffer); if(error==0) { printf("Server hat die Verbindung getrennt..\n"); break; } if(error==SOCKET_ERROR) { printf("Fehler: recv, fehler code: %d\n",WSAGetLastError()); break; } } } [/b] int main(void) { printf ("***********************\n"); printf ("****Client Programm****\n"); printf ("***********************\n"); long error; // Socket s erstellen SOCKET s; // Winsock initialisieren error = startWinsock (); if ( error != 0 ) { printf("Fehler: startWinsock, fehler code: %d\n", error ); } else { printf("Winsock erfolgreich gestartet!\n"); } //Socket starten s=socket(AF_INET,SOCK_STREAM,0); if (s==INVALID_SOCKET) { printf ("Fehler: Socket konnte nicht erstellt werden Fehlercode: %d\n" , WSAGetLastError()); } else { printf ("Socket erfolgreich erstellt!\n"); } //Verbindung zum Server herstellen struct sockaddr_in addr; memset (&addr , 0 , sizeof(addr) ); addr.sin_family = AF_INET; addr.sin_port = htons (12345); addr.sin_addr.s_addr=inet_addr("127.0.0.1"); error = connect(s,(struct sockaddr*)&addr, sizeof(addr)); if (error == SOCKET_ERROR ) { printf ("Fehler: connect() Fehlercode: %d\n", WSAGetLastError()); } else { printf ("Verbindung hergestellt!\n"); } printf ("\n\n"); error = 0; pthread_t thread1, thread2; pthread_create( &thread1, NULL, empfangen, &s); if (error !=0 ) { printf ("Konnte Thread 1 nicht erzeugen!\n;"); } pthread_create( &thread2, NULL, senden, &s); if (error !=0 ) { printf ("Konnte Thread 1 nicht erzeugen!\n;"); } closesocket(s); WSACleanup(); system("PAUSE"); return 0; }
Wenn etwas unklar ist fragt bitte
-
POSIX ist kein C Standard, falsches Forum.
-
in welches forum passt es denn besser?
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
nappy schrieb:
in welches forum passt es denn besser?
Dieses.
edit: Beziehungsweise überhaupt nicht, wenn man sich als Moderator verklickt
. Leider bin ich in diesem Unterforum kein Mod, daher kann ich dich jetzt nicht weiterverschieben. 'Tschuldigung an Unix-Tom, rüdiger oder nman für die Arbeit!
-
huch POSIX Threads gemischt mit WinSocks? Da weiß ich selbst nicht genau wo das am besten hin soll. Hier wäre es richtig für die POSIX Threads aber hier ist es falsch für die WinSocks und in WinAPI wäre es genau andersherum mit der Zuständigkeit. Ich verschiebe es mal in das rudpf.
Wobei es generell keine gute Idee ist über 260 Zeilen Code zu posten.
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum Rund um die Programmierung verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Hi,
hab das mal angefangen durchzulesen und mir sind ein paar Dinge aufgefallen:
1. lese nie mit gets() ein sondern verwende z.b. fgets:fgets(buffer, 299, stdin);
sonst hast du einen bösen BufferOverflow
2. also zumindest unter Linux(wo ich arbeite) kommt ans Ende der zu übertragenden Daten ein "\n" oder ein fflush() um die gepufferten Daten zu schreiben.
(nach einem kurzen! Blick in die Microsoft-Hilfe scheint das aber nicht zu gelten hier, aber klär das trotzdem mal^^)
3. Bin mir hier nicht ganz sicher, aber wenn du den Pointer auf das SOCKET übergibts und dann das socket schließt sollte das genauso für die threads gelten. (POSIK-Threads arbeiten im gleichen Adressraum)
EDIT:
4. Außerdem gibt es Probleme weil 2 threads auf der gleichen standardeingabe lesen. Ansonsten hat Punkt 3 das Problem bei mir gelöst
-
Mach das
system("PAUSE");
mal vor das Schließen vom Socket und WSACleanup. Bzw mach da ein join auf die Threads oder irgendwas sauberes.
-
hey danke für eure Antworten. Ich hab es soweit hinbekommen dass ich reibungslos senden und empfangen kann. Mein einziges Problem ist jetzt nur noch wenn ich zB "hallo wie geht es dir?" an den server sende und anschließend "mir auch" an den server sende steht beim server "mir auche geht es dir?"
ist bestimmt nur eine kleinigkeit aber wie behebe ich dieses Problem?
Client:
void chomp(char *str) { size_t p=strlen(str); /* '\n' mit '\0' überschreiben */ str[p-1]='\0'; } //Thread 1 void *empfangen (SOCKET *s) { printf ("Thread 1 erfolgreich gestartet!\n"); char buffer [4096]; int bytes; while ((bytes = recv((SOCKET)*s, buffer, sizeof(buffer), 0)) > 0) { printf("Gegenseite: %s \n",buffer); } return NULL; } //Thread 2 void *senden (SOCKET *s) { printf ("Thread 2 erfolgreich gestartet!\n"); char buffer [4096]; int bytes; int i; while ( fgets(buffer,4095,stdin ) ) { chomp(buffer); if ( send ( (SOCKET)*s,buffer,strlen(buffer),0) == -1 ) { break; } fflush(stdin); for (i=0;i <=4095;i++) { buffer[i]='\0'; } } return NULL; }
-
hat sich schon erledigt... lag am server da habe ich nicht den buffer nach dem empfangen gelöscht.