recv() liefert -1 in einer Methode
-
Hallo Zusammen,
ich habe folgendes Problem: Ich möchte den Tcp-Stream-Server Routinen, socket()
bind().., in eine Methode kapseln. Dabei passiert etwas merkwürdiges. Wenn
Ich den recv() in dieser Methode aufrufe, dann bekomme ich immer -1 geliefert.
Wenn ich aber alles umstelle und recv() dann wie üblich bei main() aufrufe,
dann liest recv() alles richtig. Hier ist Code von der Methode:int tcp_server(char* ip_addr, unsigned int port, unsigned char** buffer, struct sockaddr_in* server , int* cfd, struct sockaddr_in* client_sockaddr){ int sfd ; // int cfd ; int addr_size ; int read_bytes ; if( (sfd = socket(AF_INET,SOCK_STREAM, 0)) == 0 ){ perror("socket") ; return EXIT_FAILURE ; } set_server_structure(server, port, ip_addr) ; /* sets server struct sockaddr_in -for clarity*/ if((bind(sfd, (struct sockaddr *) server, sizeof(*server) )) == -1 ) { perror("bind") ; return EXIT_FAILURE ; } // addr_size = sizeof(*client_sockaddr) ; listen(sfd,0) ; /* client file decriptor */ *cfd = accept(sfd, (struct sockaddr *) client_sockaddr, (socklen_t *) &addr_size ) ; int i = 0 ; while(1){ fprintf(stdout,"port has been ACCEPTed, time to read... cfd:%d\n",*cfd) ; read_bytes = recv(*cfd, *buffer, MAXLENGTH,0) ; if(read_bytes != -1) fprintf(stdout, "read bytes:%d", read_bytes) ; } //I // fprintf(stdout, "read bytes:%d\n", read_bytes) ; return sfd ; }
und in main wird es entprechen die methode aufgerufen:
int main(int argc, char** argv) { unsigned char readbuffer[MAXLENGTH] ={'\0'} ; int sfd, cfd; struct sockaddr_in server; struct sockaddr_in client_sockaddr ; sfd = tcp_server(argv[2],atol(argv[3]), &readbuffer,&server, &cfd, &client_sockaddr) /* do sth */ return EXIT_SUCCESS ; }
Wie kann ich recv() ausserhalb von main() in einer Methode richtig aufrufen? Hat
jemand das Problem gehabt? Im Netz konnte ich nur standarde Beispiele gefunden
wo alles in main implementiert sind.Danke im voraus,
-
hi,
ich hab mir den code noch nicht ganz angeschaut - gerade keine zeit. was mir aber gleich mal aufgefallen ist und was so nicht stimmt ist folgender code:if( (sfd = socket(AF_INET,SOCK_STREAM, 0)) == 0 ){ perror("socket") ; return EXIT_FAILURE ; }
0 ist ein gültiger filedescriptor - daher sollte der code eher so aussehen:
if( (sfd = socket(AF_INET,SOCK_STREAM, 0)) == -1 ){ perror("socket") ; return EXIT_FAILURE ; }
blan
-
blan schrieb:
0 ist ein gültiger filedescriptor - daher sollte der code eher so aussehen:
if( (sfd = socket(AF_INET,SOCK_STREAM, 0)) == -1 ){ perror("socket") ; return EXIT_FAILURE ; }
blan
Danke, es stimmt. habe das auf -1 umgestellt: Noch kriege ich -1 von read
geliefert.. und ich sehe den Grund nicht warum er mir nicht gültige Daten
ausliefern sollte.
-
hab mir auch nicht alles angeschaut, aber ich wette mit
set_server_structure(server, port, ip_addr) ;
stimmt was nicht, da du uns diese funktion ja vorenthalten hast
-
Wieso lässt du dir ausgerechnet bei recv die Fehlerursache nicht genauso wie bei den anderen Systemaufrufen mit perror ausgeben?
-
unsigned char** buffer
ändern in
unsigned char* bufferrecv(*cfd, *buffer, MAXLENGTH,0) ;
ändern in
recv(*cfd, buffer, MAXLENGTH,0) ;tcp_server(argv[2],atol(argv[3]), &readbuffer,&server, &cfd, &client_sockaddr)
ändern in
tcp_server(argv[2],atol(argv[3]), readbuffer,&server, &cfd, &client_sockaddr)