2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Unix, socket, select()
Сообщение25.08.2010, 21:36 
Аватара пользователя


07/07/10
100
Нижний Новгород
Написал сервер на неблонирующихся сокетах под 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 


16/06/10
199
Чем проверяете связь с сервером? Может просто маловат таймаут (переменная struct timeval timeout), и Вы не успеваете?

 Профиль  
                  
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 09:15 
Аватара пользователя


07/07/10
100
Нижний Новгород
Вот, знак равно убрал всё норм, только почему-то не печатает номер порта, а почему? подскажешь?

 Профиль  
                  
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 11:33 
Аватара пользователя


01/04/10
910
Как поймать ошибку? Ваша программа у меня отрабатывает с результатом:

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

 Профиль  
                  
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 12:40 
Аватара пользователя


07/07/10
100
Нижний Новгород
в строчке
Код:
if(select(mx+1, &readset, NULL, NULL, &timeout) <= 0)


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

 Профиль  
                  
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 12:58 


16/06/10
199
Unmanner в сообщении #347338 писал(а):
почему-то не печатает номер порта,
Попробуйте отключить буферизованный вывод для stdout, см. функцию setvbuf().

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

 Профиль  
                  
 
 Re: Unix, socket, select()
Сообщение26.08.2010, 13:09 
Аватара пользователя


07/07/10
100
Нижний Новгород
Да, всё дело в принтах этих чтоб их....) разобрался)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group