Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: dwni2 в Sep 28, 2012, 19:11



Титла: socket програмиране
Публикувано от: dwni2 в Sep 28, 2012, 19:11
здравейте изкам да попитам защо от тези два кода първия работи а втория не
1
Код
GeSHi (C):
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netdb.h>
  7. #include <errno.h>
  8. #include <sys/select.h>
  9. int main(int argc,char *argv[]){
  10. int port,sock, check,newsock,a,b,yes;
  11. char buf[255],buf1[255],buf2[255];
  12. struct sockaddr_in server,client1;
  13. socklen_t len=sizeof(client1);;
  14. fd_set read,master;
  15. port=atoi(argv[1]);
  16. memset(&server,0,sizeof(server));
  17. server.sin_family=AF_INET;
  18. server.sin_port=htons(port);
  19. server.sin_addr.s_addr=INADDR_ANY;
  20. sock=socket(AF_INET,SOCK_STREAM,0);
  21. setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes));
  22. bind(sock,(struct sockaddr *)&server, sizeof(server));
  23. listen(sock,10);
  24. FD_ZERO(&master);
  25. FD_SET(sock,&master);
  26. FD_SET(0,&master);
  27. for(;;){
  28. gore:
  29. read=master;
  30. select(FD_SETSIZE,&read,NULL,NULL,NULL);
  31. for(a=0;a<FD_SETSIZE;a++){
  32. if(FD_ISSET(a,&read)&&a!=0){
  33. if(a==sock){
  34. newsock=accept(sock,(struct sockaddr*)&client1,&len);
  35. FD_SET(newsock,&master);
  36. inet_ntop(AF_INET, &(client1.sin_addr), buf1, INET_ADDRSTRLEN);
  37. printf("New connection from socket %d ip address %s port %d\n",newsock, buf1, n
  38. }
  39. else{
  40. check=recv(a,buf,sizeof(buf),0);
  41. if(!check){
  42. close(a);
  43. FD_CLR(a,&master);
  44. goto gore;}
  45.  
  46. buf[check]='\0';
  47. printf("%s\n",buf);
  48. }
  49. }
  50. else if(FD_ISSET(0,&read)){
  51.  
  52. gets(buf1);
  53.  
  54. printf("to socket: ");
  55. gets(buf2);
  56. check=strlen(buf1);
  57. buf[check]=0;
  58. b=atoi(buf2);
  59. if(b==3){
  60. printf("Trqbva da ne se izpra6tat syob6teniq do ekrana\n");
  61. goto gore;}
  62. send(b,buf1,strlen(buf1),0);
  63. goto gore;
  64. }
  65. }
  66. }
  67.  
  68. return 0;}
  69.  
2
Код
GeSHi (C):
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <netdb.h>
  7. #include <stdlib.h>
  8. int main(int argc,char *argv[]){
  9. int a,b,sock,newsock,port;
  10. char buf[255];
  11. fd_set read;
  12. struct sockaddr_in server,client;
  13. socklen_t clilen;
  14. memset(&server,0,sizeof(server));
  15. clilen=sizeof(server);
  16. sock=socket(AF_INET,SOCK_STREAM,0);
  17. server.sin_family=AF_INET;
  18. server.sin_addr.s_addr=INADDR_ANY;
  19. server.sin_port=htons(atoi(argv[1]));
  20. bind(sock,(struct sockaddr *)&server,sizeof(server));
  21. listen(sock,10);
  22. while(1){
  23. FD_ZERO(&read);
  24. for(a=sock;a<FD_SETSIZE;a++) FD_SET(a,&read);
  25. select(FD_SETSIZE,&read,NULL,NULL,NULL);
  26. for(a=sock;a<FD_SETSIZE;a++)
  27. if(FD_ISSET(a,&read)){
  28. if(a==sock) newsock=accept(sock,(struct sockaddr*) &server, &clilen);
  29. else{
  30. b=recv(a,buf,sizeof(buf),0);
  31. buf[b]=0;
  32. printf("%s\n",buf);
  33. }}}
  34. 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 да разбера причината :)