- 论坛徽章:
- 0
|
今天在测试EPOLL/SELECT/POLL时发现个问题,就是SELECT /EPOLL在某种情况下,返回的状态是错误,
经过再三测试,发现的确存在这样的问题,
在SELECT的时候,FD_ISSET虽然为真,但实际读取时无法读取数据,
代码如下:不信可以自己跑跑:
/*
* SocketClient.c
*
* Created on: 2013-3-19
* Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/io.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <bits/socket.h>
#include <sys/ioctl.h>
#include <fcntl.h>
int main()
{
int i=0;
struct sockaddr_in sockServer;
sockServer.sin_addr.s_addr=inet_addr("192.168.8.198");
sockServer.sin_port = 10008;
sockServer.sin_family=AF_INET;
char buff[1024];
memset(buff,1,1024);
int iServer=0;
time_t befTime=time(NULL);
pid_t pid=0;
//int flag= fcntl(iClient,F_GETFL,0);
//printf("NONBLOCK :%d\n",flag & O_NONBLOCK);
for(i=0; i<900; i++)
{
pid=fork();
if(pid == 0)
{
int iClient= socket(AF_INET,SOCK_STREAM,0);
printf("Process %d Socket :%d \n",i,iClient);
int iW=connect(iClient,(struct sockaddr*)&sockServer,sizeof(struct sockaddr_in));
printf("Process %d Connect Result:%d Error: %d\n",i,iW,errno);
iW=write(iClient,buff,1024);
printf("Process %d Write Result: %d \n",i,iW);
//_exit(0);
//pause();
return 0;
}
}
int times=0;
while(times<900)
{
wait(NULL);
times++;
}
time_t endTime=time(NULL);
printf("Over ,Total Time :%d \n",endTime-befTime);
exit(0);
}
/*
============================================================================
Name : TestFork.c
Author : Lixianke
Version :
Copyright : Jetsen
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/io.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <bits/socket.h>
#define max(a,b) (a>b ? a: b)
typedef enum {false = 0, true = 1} bool;
int main(void) {
int iServer= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in iAddr;
iAddr.sin_addr.s_addr =INADDR_ANY;//inet_addr("");
iAddr.sin_port=10008;
iAddr.sin_family=AF_INET;
int iRe=bind(iServer,(struct sockaddr*)&iAddr,sizeof(struct sockaddr_in));
printf("Bind Server %d ,Error: %d\n",iRe,errno);
iRe=listen(iServer,1024);
printf("Listen Server %d \n",iRe);
int pClient[1024];
int iIndex =1,iMax=0;
char buff[1024];
time_t befTime=time(NULL);
printf("Server Start,Socket %d \n",iServer);
int iFlag=fcntl(iServer,F_GETFL,0);
printf("Block: %d \n",iFlag & O_NONBLOCK);
while(true)
{
fd_set readSet;
FD_ZERO(&readSet);
FD_SET(iServer,&readSet);
pClient[0] = iServer;
int i=1;
for(; i< iIndex; i++)
{
FD_SET(pClient[i],&readSet);
iMax = max(pClient[i],iMax);
}
iMax = max(iServer,iMax);
select(iMax+1,&readSet,NULL,NULL,NULL);
for (i = 1; i < iIndex; i++)
{
if (pClient[i] != iServer && FD_ISSET(pClient[i],&readSet))
{
int j=read(pClient[i], buff, 1024);
printf("Server %d Read %d Fileno %d ,Ret ,%d\n ",i,j,pClient[i],FD_ISSET(pClient[i],&readSet));
}
}
if(FD_ISSET(iServer,&readSet))
{
pClient[iIndex]=accept(iServer,NULL,NULL);
printf("Server Accept %d \n",iIndex);
++iIndex;
}
}
time_t endTime=time(NULL);
printf("Over ,Total Time :%d \n",endTime-befTime);
return EXIT_SUCCESS;
}
|
|