Probleme mit recv
-
Hallo
Beim Empfangen von Daten versucht recv eine lange Zeit Daten zu empfangen, ob keine Daten mehr vorhanden sind.
mfg
funcky29SOCKET sd; struct sockaddr_in box; //Adresse des Com-Servers /* ** initialiesiert die variable box und versucht einen Socket zu öffnen */ int sc_open(char *hostname, int portnr) { HOSTENT *he; WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) { printf("The initialization of WinSock failed. Make sure that you have installed WinSock 2.0 or higher."); return(0); } he = (HOSTENT *)gethostbyname(hostname); if(he) { CopyMemory(&box.sin_addr, he->h_addr, sizeof box.sin_addr); } else{ printf("Host nicht gefunden"); return(0); } box.sin_family = AF_INET; box.sin_port = htons(portnr); //Ziel Port-Nummer sd = -1; //öffne Handle für TCP-Transport if((sd = socket(PF_INET,SOCK_STREAM, 0)) < 0) { printf("socket error"); sd = -1; return(0); } //öffne Verbindung zum COM-Server Port if(connect (sd, (struct sockaddr*)&box,sizeof(box)) < 0) { closesocket(sd); //schließe Handle wieder printf("connect error"); sd = -1; return(0); } return(1); } void sc_read() { fd_set rd_ready; //Bitfelder pro Socket-Deskriptor struct timeval maxwait; int len = 0; char RecBuf[1024]; while(1){ FD_ZERO(&rd_ready); FD_SET (sd,&rd_ready); maxwait.tv_sec = 0; maxwait.tv_usec = 200; if(select(sd+1,&rd_ready,(fd_set*)0,(fd_set*)0,&maxwait) == 0) continue; if(FD_ISSET(sd, &rd_ready)) //liegen Daten vor? { if((len=recv(sd, RecBuf, (sizeof(RecBuf)-1) ,0))>0) { RecBuf[len] = '\0'; //markiere Stringende printf("%s", RecBuf); } else if(len == 0) //regulärer Verbindungsabbau { //Beim letzten Aufruf von recv, wo len == 0 ist //bleibt es für eine Zeit lang hängen return; } else if(len <= 0) //Verbindungsfehler { printf("read error"); return; } } } }