Написал сервер на неблонирующихся сокетах под 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);
}
}
}
}