Server/Client in C -> GELÖST ;) minichat
-
Hallo
ich dachte ich mache nochmals ein neues Thead auf um zu zeigen, wie man ein Chat schreibt -> mithilfe der Seite:
http://www.c-worker.ch/tuts/wstut_op.php
darauf befinden sich 2 Datein zum runterladensock.c und socksrv.c
achtung vor linker setzen: libw2_32.a
-> erst Server öffnen
-> dann Clientin dieser Version geht der Client leider nach 1 sec
aus wenn man zurck schreibtauch das Senden als Server wird im Server
gleichzeitig mitclient sendet:
server: "beispieltext"dargestellt
WARUM ????
aber ich hoffe ich konnte ein Beitrag für die Nachwelt erstellen
version 1.0:
Server
//////////////////////////// // Server // //////////////////////////// #include <windows.h> #include <winsock2.h> #include <stdio.h> //Prototypen int startWinsock(void); int main(int argc, char *argv[]) { long rc; SOCKET acceptSocket; SOCKET connectedSocket; SOCKADDR_IN addr; char buf[256]; char buf2[300]; // Winsock starten rc=startWinsock(); // Socket erstellen acceptSocket=socket(AF_INET,SOCK_STREAM,0); // Socket binden memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(12345); addr.sin_addr.s_addr=ADDR_ANY; rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); // In den listen Modus rc=listen(acceptSocket,10); // Verbindung annehmen connectedSocket=accept(acceptSocket,NULL,NULL); // Daten austauschen while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); buf[rc]='\0'; printf("Client sendet: %s\n",buf); rc=send(connectedSocket,buf2,strlen(buf2),0); // printf("Server: "); gets(buf2); send(connectedSocket,buf2,strlen(buf2),0); rc=recv(connectedSocket,buf2,256,0); buf2[rc]='\0'; } closesocket(acceptSocket); closesocket(connectedSocket); WSACleanup(); Sleep(1000); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
Client
#include <windows.h> #include <winsock2.h> #include <stdio.h> //Prototypen int startWinsock(void); int main() { long rc; SOCKET s; SOCKET connectedSocket; SOCKADDR_IN addr; char buf[256]; char buf2[200]; // Winsock starten rc=startWinsock(); // Socket erstellen s=socket(AF_INET,SOCK_STREAM,0); connectedSocket=socket(AF_INET,SOCK_STREAM,0); // 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("127.0.0.1"); // zielrechner ist unser eigener rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); connectedSocket=accept(s,NULL,NULL); // Daten austauschen while(rc!=SOCKET_ERROR) { printf("\nZeichenfolge eingeben [max 256]: "); gets(buf); send(s,buf,strlen(buf),0); rc=recv(s,buf,256,0); buf[rc]='\0'; // rc=recv(connectedSocket,buf,256,0); printf("Server sendet: %s\n",buf); rc=send(connectedSocket,buf,strlen(buf),0); buf[rc]='\0'; } closesocket(s); closesocket(connectedSocket); WSACleanup(); Sleep(1000); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
viel spaß damit...
ps: die fehlermeldungun hab ich auch mal gelöscht damit man mal sieht was genau da passiert und es hält den code klein
-
HABS
bitte ändern im Server:
Server:
... while(rc!=SOCKET_ERROR) { printf("Server: "); rc=recv(connectedSocket,buf,256,0); // hält die verbindung am laufen buf[rc]='\0'; // texteingabe auf 0 zurück setzen buf2[rc]='\0'; // texteingabe auf 0 zurück setzen printf("Client sendet: %s\n",buf); // zeige text an gets(buf2); // hier wird Text eingegeben ... rc=send(connectedSocket,buf2,strlen(buf2),0); // ...und gesendet } ...
bitte ändern im Client:
Client:
... while(rc!=SOCKET_ERROR)//rc!=SOCKET_ERROR) { printf("Client: "); gets(buf); send(s,buf,strlen(buf),0); rc=recv(s,buf,256,0); buf[rc]='\0'; printf("\nServer antwortet: %s\n",buf); // ... }
nur das problem ist , das der Client erst senden muss und erst wieder schreiben kann wenn der Server geantwortet hat
ist kla es liegt ja auch an
gets[]
in der While schleife
kann man das umgehehn ???
-
du hast nen kleinen dreher drinServer:
while(rc!=SOCKET_ERROR) { rc=recv(connectedSocket,buf,256,0); buf[rc]='\0'; printf("Client sendet: %s\n",buf); printf("Server: "); gets(buf2); rc=send(connectedSocket,buf2,strlen(buf2),0); }
Client
while(rc!=SOCKET_ERROR) { printf("Client: "); gets(buf); send(s,buf,strlen(buf),0); rc=recv(s,buf,256,0); buf[rc]='\0'; printf("\nServer antwortet: %s\n",buf); }
-
Auch Dein Code ist nicht zu gebrauchen.