send recv "gleichzeitig" ???
-
[b]Client :[/b] #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(void) { int i = 0; int s; int bytes; char buffer[4096]; struct sockaddr_in addr; s = socket(AF_INET,SOCK_STREAM,0); if(s == -1) { perror("socket() failed !\n"); exit(0); } addr.sin_family = AF_INET; addr.sin_port = htons(7000); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); if(connect(s,(struct sockaddr*)&addr,sizeof(addr)) == -1) { perror("connect() failed !\n "); exit(0); } for(;;) { printf("< "); while((buffer[i] = getchar()) != '\n') i++; buffer[i] = '\0'; bytes = send(s,buffer,strlen(buffer),0); if(bytes == -1) { perror("send() failed !\n"); exit(0); } i = 0; bytes = recv(s,buffer,sizeof(buffer),0); buffer[bytes] = '\0'; printf("> %s\n",buffer); } close(s); exit(0); }
[b]Server :[/b] #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> int main(void) { int s; int c; int addr_length; int bytes; int i; char buffer[4096]; struct sockaddr_in addr; s = socket(PF_INET,SOCK_STREAM,0); if(s == -1) { perror("socket() failed !\n"); exit(0); } addr.sin_addr.s_addr = INADDR_ANY; addr.sin_port = htons(7000); addr.sin_family = AF_INET; if(bind(s, (struct sockaddr*)&addr, sizeof(addr)) == -1) { perror("bind() failed !\n"); exit(0); } if(listen(s,3) == -1) { perror("listen() failed !\n"); exit(0); } addr_length = sizeof(addr); c = accept(s, (struct sockaddr*)&addr,&addr_length); printf("Client from %s is connecting...\n",inet_ntoa(addr.sin_addr)); if( c == -1) { perror("accept() failed !\n"); exit(0); } printf("Client %s is connected...\n",inet_ntoa(addr.sin_addr)); while(1) { bytes = recv(c,buffer,sizeof(buffer),0); if(bytes == -1) { perror("recv() failed !\n"); exit(0); } else { buffer[bytes] = '\0'; printf("> %s\n",buffer); } i = 0; printf("< "); while( (buffer[i] = getchar()) != '\n') i++; buffer[i] = '\0'; bytes = send(c,buffer,strlen(buffer),0); if(bytes == -1) { perror("send() failed !\n"); exit(0); } } close(c); close(s); exit(0); }
Das Problem ist, client schickt was, server antworter, client bekommt die Nachricht und schickt an Server. Man kann also nur schicken und muss auf eine Antwort warten, wie könnte man das Programm erweitern, dass ich ständig was schicken kann, der andere immer was bekommt, man während dessen aber auch Nachrichten erhalten kann ?
-
Mit 2 Threads oder 2 Prozessen. Oder über Asynchrone I/O sollt's auch gehen, damit kenn ich mich aber zuwenig aus.
-
Ringding schrieb:
Mit 2 Threads oder 2 Prozessen. Oder über Asynchrone I/O sollt's auch gehen, damit kenn ich mich aber zuwenig aus.
threads kenn ich...aber 2 prozesse??? wie schaut sowas aus?
cu
-
Schau dir mal select an, damit kannst du den Status von sockets abfragen, also etwa in der art:
while (true) { if (select zeigt neue daten am socket) { recv(daten); } else { produziere daten send(daten); } }
select kann einem sagen ob man an einem socket gerade Daten lesen kann, wenn ja, einfach abholen,w enn nein üebspringt man das abholen und geht im normalen Konzept weiter.
-
[quote="winsock"]
Ringding schrieb:
threads kenn ich...aber 2 prozesse??? wie schaut sowas aus?
Einen Kindprozess könnte ich mit fork() machen, aber da hätte ich auch nicht viel von.
-
Hab's noch nie probiert aber du könntest auf beiden seiten client und server socket öffnen ( verschiedene ports natürlich ) und eine verbindung logisch zum schreiben und die andere zum lesen verwenden. Müssen natürlich 2 prozesse oder threads sein.
Kurt
-
Also so ein "chat" prog hab ich auch schon geschrieben. Wie bereits Zuk schreibt
mußt Du mit fork() einen Kindsprozess öfnen, der die Antwort verarbeitet.
Das Problem ist nur das du den Prog (Server sowie Client)am selben rechner
ausprobierst. Normalerweise im chatprog gibts auf BEIDEN SEITEN jeweils ein
Prozess der lauscht und einen anderen der conected(). Das heist wenn der 'lauscher(zb Port 7000)' eine Anfrage entgegennimmt gibt er nur die IP des 'fragenden' an
den 'conect prozess' weiter. Dieser eröfnet widerrum eine verbindung zum 'festgelegten, bekannten port(7000)' des anfragerprog, welches natürlich genauso
wie das entgegnnehmerprog aussieht. und immer so weiter.
-
Beide als Server wäre sicherlich eine Möglichkeit, mit jeweile einem Port zum senden und zum empfangen. Ich werde es mal so probieren.
@linu(x)bie
Hast du dein Chat Programm vielleicht noch, wäre nett wen du es posten würdest. Thx im voraus...
-
Das alte nicht mehr, aber ich schick dir ein neues.
Kannst es in den nächsten Tagen erwarten.
-
Find ich okay von dir. Schick es bitte an Arkadius.t@web.de . Danke schon mal..
-
winsock schrieb:
Ringding schrieb:
Mit 2 Threads oder 2 Prozessen. Oder über Asynchrone I/O sollt's auch gehen, damit kenn ich mich aber zuwenig aus.
threads kenn ich...aber 2 prozesse??? wie schaut sowas aus?
cu
falls du qt oder SDL benutzt, kannst du dort eine funktion in einem extra thread starten, d.h. du hast z.b. die funktion abfragen(), die wird dann "parallell" ausgeführt, wenn du bei SDL die funktion SDL_CreateThread mit den entsprechenden parametern aufrufst.