Автор Тема: socket програмиране  (Прочетена 3959 пъти)

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
socket програмиране
« -: 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;}
« Последна редакция: Sep 28, 2012, 19:31 от bop_bop_mara »
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: socket програмиране
« Отговор #1 -: Sep 28, 2012, 19:58 »
Не работи, защото викаш FD_ZERO върху fd_set-а и съответно забрави select() да те нотифицира за събития по listening сокета. Така че реално никога не accept()-ваш нови връзки.
Активен

"Knowledge is power" - France is Bacon

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: socket програмиране
« Отговор #2 -: Sep 28, 2012, 20:41 »
мерси но защо и като коментирам FD_ZERO е същото
след първия recv получавам stringa 1024 пъти и после блокира и не получава съобщенията сървъра
а при първия случай работи коректно
защо при първия случай се използват две променливи от тип fd_set каква е разликата защото и при първия случай има FD_ZERO но работи
Активен

dwni2

  • Напреднали
  • *****
  • Публикации: 79
    • Профил
Re: socket програмиране
« Отговор #3 -: 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 да разбера причината :)
Активен

Подобни теми
Заглавие Започната от Отговора Прегледи Последна публикация
TCP/IP и socket програмиране
Общ форум
nedy 3 4906 Последна публикация Nov 29, 2005, 22:28
от sdr
Socket programming
Общ форум
tws 3 4195 Последна публикация Mar 01, 2006, 11:16
от i_danov
proxy - Out of socket memory
Хардуерни и софтуерни проблеми
vox 6 3006 Последна публикация Jan 28, 2014, 11:36
от vox
Настройка на download скорост по socket-и
Настройка на програми
sharena_sol 3 2106 Последна публикация Jun 27, 2015, 10:58
от 4096bits
Systemd socket activation
Системна Сигурност
4096bits 4 12339 Последна публикация May 20, 2018, 08:13
от 4096bits