Hilfe bei Winsock Chat Client von c-worker
-
Hallo zusammen ich habe mich jetzt ca 1 Woche mit dem Tutorial von c-worker beschäftigt, und auch so gut wie alles Verstanden, jetzt hab ich auf der seite von c-worker einen Chat Client und Server gefunden der server läuft einwand Frei, aber der Client einfach nicht hier der Quellcode:
#pragma comment( lib, "ws2_32.lib" ) #include <stdlib.h> #include <stdio.h> #include <winsock2.h> #include <conio.h> // Startet Winsock und gibt einige Infos zur Version aus // Starts winsock and dumps some infos about the version int startWinsock() { int rc; WSADATA wsaData; rc=WSAStartup(MAKEWORD(2,0),&wsaData); printf("Return Code: %d\n",rc); if(rc==SOCKET_ERROR) { printf("Error, exiting!\n"); return rc; } printf("Winsock started:\n"); printf("Version: %d.%d\n",LOBYTE(wsaData.wVersion),HIBYTE(wsaData.wVersion)); printf("High Version: %d.%d\n",LOBYTE(wsaData.wHighVersion),HIBYTE(wsaData.wHighVersion)); printf("Description: %s\n",wsaData.szDescription); printf("System Status: %s\n",wsaData.szSystemStatus); return 0; } // Sucht eine IP anhand eines Strings, der entweder die IP als String // oder einen Hostname enthalten kann // Searches an IP based on a string, which can contain an IP as string // or a hostname long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr) { long rc; unsigned long ip; HOSTENT* he; if(hostnameOrIp==NULL || addr==NULL) return SOCKET_ERROR; ip=inet_addr(hostnameOrIp); if(ip!=INADDR_NONE){ addr->sin_addr.s_addr=ip; return 0; } else { he=gethostbyname(hostnameOrIp); if(he==NULL) { return SOCKET_ERROR; } else { memcpy(&(addr->sin_addr),he->h_addr_list[0],4); } return 0; } } // main... int main(int argc, char** argv) { SOCKET s; SOCKADDR_IN addr; char c; char buf[1024]; char inpBuf[1024]; int inpBufPos=0; fd_set fdSetRead; TIMEVAL timeout; int rc; if(argc<2) { printf("Usage: chatclient <server>\n"); return 1; } // start winsock rc=startWinsock(); if(rc==SOCKET_ERROR) return 1; // addr vorbereiten, hostname auflösen // prepare addr, resolve hostname memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(1234); rc=getAddrFromString(argv[1],&addr); if(rc==SOCKET_ERROR) { printf("Error: Cannot resolve Host %s\n", argv[1]); return 1; } // socket erstellen // create socket s=socket(PF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { printf("Error, cannot create socket: %d\n",WSAGetLastError()); return 1; } // verbinden.. // connect.. printf("Connecting...\n"); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { printf("Error: connect failed: %d\n",WSAGetLastError()); return 1; } printf("\n"); while(rc!=SOCKET_ERROR) { // keyboard input ? while(kbhit()) { c=getch(); if(c==13) { rc=send(s,inpBuf,inpBufPos,0); inpBuf[0]='\0'; inpBufPos=0; } else { inpBuf[inpBufPos++]=c; } } inpBuf[inpBufPos]='\0'; // fd_set und timeout vorbereiten // prepare fd_set and timeout FD_ZERO(&fdSetRead); FD_SET(s,&fdSetRead); timeout.tv_sec=0; timeout.tv_usec=0; // prüfen ob ein socket bereit ist, da timeout=0 kehrt die funktion // sofort wieder zurück nach dem aufruf. // achtung: das timeout auf 0 setzen oder als paremeter NULL mitgeben // ist NICHT das gleiche. auf 0 gesetzt kehrt sofort zurück, während // NULL blockt. // check if any socket is ready (timeout=0, the function returns without delay) while((rc=select(0,&fdSetRead,NULL,NULL,&timeout))>0) { rc=recv(s,buf,1023,0); // server hat die verbindung beendet ? // server closed connection ? if(rc==0) { printf("Server closed connection!\n"); return 1; // fehler: beenden! // error: abort! } else if(rc==SOCKET_ERROR) { printf("Error: recv failed: %d\n",WSAGetLastError()); return 1; } // empfangene daten ausgeben // print received data buf[rc]='\0'; printf("%s\n",buf); } } // aufräumen // cleanup.. closesocket(s); WSACleanup(); printf("Client shutdown, press any key to exit\n"); getch(); return 0; }Ich kann den Code auch Compelieren aber der Funktioniert einfach nicht. Der kommt nur bis
if(argc<2) { printf("Usage: chatclient <server>\n"); return 1; }und dan beendet der.
Bitte helft mir!
THX schonmal
-
Ja wie rufst du das Programm den auf? Und bist du dir sicher, dass DU das Programm geschrieben hast?
-
Ich hab doch gesagt das ich den Chat auf der seite von c-worker gefunden hab, und dieser nicht funktioniert!
-
Der funktioniert ... du musst das Programm aber mit Parametern starten (argc < 2 setz voraus, dass du mindestens einen Parameter angibst!)
-
Habs schon gefunden THX aber^^
ich musste den mit Client.exe 127.0.0.1 starten
-
Jo, d.h. du übergibst dem Programm den Paramter "127.0.0.1" was "localhost" entspricht
