Титла: socket програмиране
Публикувано от: dwni2 в Sep 28, 2012, 19:11
здравейте изкам да попитам защо от тези два кода първия работи а втория не 1 GeSHi (C): #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <errno.h> #include <sys/select.h> int main(int argc,char *argv[]){ int port,sock, check,newsock,a,b,yes; char buf[255],buf1[255],buf2[255]; struct sockaddr_in server,client1; socklen_t len=sizeof(client1);; fd_set read,master; port=atoi(argv[1]); memset(&server,0,sizeof(server)); server.sin_family=AF_INET; server.sin_port=htons(port); server.sin_addr.s_addr=INADDR_ANY; sock=socket(AF_INET,SOCK_STREAM,0); setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)); bind(sock,(struct sockaddr *)&server, sizeof(server)); listen(sock,10); FD_ZERO(&master); FD_SET(sock,&master); FD_SET(0,&master); for(;;){ gore: read=master; select(FD_SETSIZE,&read,NULL,NULL,NULL); for(a=0;a<FD_SETSIZE;a++){ if(FD_ISSET(a,&read)&&a!=0){ if(a==sock){ newsock=accept(sock,(struct sockaddr*)&client1,&len); FD_SET(newsock,&master); inet_ntop(AF_INET, &(client1.sin_addr), buf1, INET_ADDRSTRLEN); printf("New connection from socket %d ip address %s port %d\n",newsock , buf1 , n } else{ check=recv(a,buf,sizeof(buf),0); if(!check){ close(a); FD_CLR(a,&master); goto gore;} buf[check]='\0'; } } else if(FD_ISSET(0,&read)){ gets(buf1); gets(buf2); check=strlen(buf1); buf[check]=0; b=atoi(buf2); if(b==3){ printf("Trqbva da ne se izpra6tat syob6teniq do ekrana\n"); goto gore;} send(b,buf1,strlen(buf1),0); goto gore; } } } return 0;}
2 GeSHi (C): #include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdlib.h> int main(int argc,char *argv[]){ int a,b,sock,newsock,port; char buf[255]; fd_set read; struct sockaddr_in server,client; socklen_t clilen; memset(&server,0,sizeof(server)); clilen=sizeof(server); sock=socket(AF_INET,SOCK_STREAM,0); server.sin_family=AF_INET; server.sin_addr.s_addr=INADDR_ANY; server.sin_port=htons(atoi(argv[1])); bind(sock,(struct sockaddr *)&server,sizeof(server)); listen(sock,10); while(1){ FD_ZERO(&read); for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read); select(FD_SETSIZE,&read,NULL,NULL,NULL); for(a=sock;a<FD_SETSIZE;a++) if(FD_ISSET(a,&read)){ if(a==sock) newsock=accept(sock,(struct sockaddr*) &server, &clilen); else{ b=recv(a,buf,sizeof(buf),0); buf[b]=0; }}} return 0;}
Титла: Re: socket програмиране
Публикувано от: gat3way в Sep 28, 2012, 19:58
Не работи, защото викаш FD_ZERO върху fd_set-а и съответно забрави select() да те нотифицира за събития по listening сокета. Така че реално никога не accept()-ваш нови връзки.
Титла: Re: socket програмиране
Публикувано от: dwni2 в Sep 28, 2012, 20:41
мерси но защо и като коментирам FD_ZERO е същото след първия recv получавам stringa 1024 пъти и после блокира и не получава съобщенията сървъра а при първия случай работи коректно защо при първия случай се използват две променливи от тип fd_set каква е разликата защото и при първия случай има FD_ZERO но работи
Титла: Re: socket програмиране
Публикувано от: dwni2 в Sep 28, 2012, 22:58
мисля че разбрах от къде е грешката във втория пример вклучих errno.h и проверих резултата от select връща -1 и настройва errno на bad file descriptor значи след for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read); във втория пример аз се опитвам да задам несъществуващи файлови дескриптори и за това ми връща -1 selecta и не функционира добре че е errno да разбера причината :)
|