2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Unix, socket, select()
Сообщение25.08.2010, 21:36 
Аватара пользователя
Написал сервер на неблонирующихся сокетах под UNIX, не то чтобы сам, просто переделал имеющийся в статье про программирование сокетов в интернете.

программа завершается через 5 секунд с ошибкой:
Код:
select: No message of desired type

Вопрос, что не так с SELECT()?




Код:
#include <sys/socket.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <time.h>


//using namespace std;



int main()

{

printf("ok");

int descriptors[100], maxd;
unsigned int port;
int listener, i, mx;
struct sockaddr_in addr;
int bytes_read;
char buffer[1024];

printf("z");

for(i=0;i<100;i++){printf("ok"); descriptors[i]=0; printf("ok");}




listener = socket(AF_INET, SOCK_STREAM, 0);


   if(listener < 0)
                {
                perror("socket");
                exit(1);
                }



fcntl(listener, F_SETFL, O_NONBLOCK);
port = 50000;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;

               while(port != 55000)

                {

                addr.sin_port = htons(port);

                if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
                {
                port++;
                }

                               else
                               {
                               printf("PORT %d", port);
                               break;
                               }

                }


listen(listener, 10);


                while(1){

                fd_set readset;
   FD_ZERO(&readset);
   FD_SET(listener, &readset);

   i = 0;

                               while(i<100 && descriptors[i] != 0)
                               {
                               FD_SET(descriptors[i], &readset);
                               i++;
                               }



        struct timeval timeout;
        timeout.tv_sec = 5;
        timeout.tv_usec = 0;

                maxd = descriptors[0];

                               for(i=0;i<100;i++)
                               {
                               if(maxd < descriptors[i])
                                               {
                                               maxd = descriptors[i];
                                               }

                               }

                               if(maxd > listener)
                               {
                               mx = maxd;
                               }

                                               else

                                                               {
                                                               mx = listener;
                                                               }



printf("mx=%d", mx);

                               if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)
                               {
                               perror("select");
                               exit(3);
                               }



                               if(FD_ISSET(listener, &readset))
                               {
                               int sock = accept(listener, NULL, NULL);

                                               if(sock < 0)
                                               {
                                               perror("accept");
                                               exit(3);
                                               }



                fcntl(sock, F_SETFL, O_NONBLOCK);


                               for(i=0;i<100;i++)
                               {
                               if(descriptors[i] == 0)
                                               {
                                               descriptors[i] = sock;
                                               break;
                                               }

                               }


        }


                                               while(i<100 && descriptors[i] != 0)
                                               {

                                                               if(FD_ISSET(descriptors[i], &readset))
                                                               {

                                                           bytes_read = recv(descriptors[i], buffer, 1024, 0);
                                                                              if(bytes_read <= 0)
                                                                              {
                                                                              close(descriptors[i]);
                                                                              descriptors[i] = 0;
                                                                              continue;

               }

                                                           send(descriptors[i], buffer, bytes_read, 0);
                                                               }

        }

    }

}

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 08:58 
Чем проверяете связь с сервером? Может просто маловат таймаут (переменная struct timeval timeout), и Вы не успеваете?

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 09:15 
Аватара пользователя
Вот, знак равно убрал всё норм, только почему-то не печатает номер порта, а почему? подскажешь?

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 11:33 
Аватара пользователя
Как поймать ошибку? Ваша программа у меня отрабатывает с результатом:

Цитата:
select: Success
okzokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
okokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
okokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
okokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
okokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokokok
okokokokokokokokokokokokokokokokokokokokokokokokokokokPORT 50000mx=3

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 12:40 
Аватара пользователя
в строчке
Код:
if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)


убрать знак равенства.

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 12:58 
Unmanner в сообщении #347338 писал(а):
почему-то не печатает номер порта,
Попробуйте отключить буферизованный вывод для stdout, см. функцию setvbuf().

creative в сообщении #347365 писал(а):
Ваша программа у меня отрабатывает с результатом
Это нормально, завершение по таймауту ("Select: Success"). Код бы почистить от лишнего вывода (printf()).

 
 
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 13:09 
Аватара пользователя
Да, всё дело в принтах этих чтоб их....) разобрался)

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group