当前位置: 技术问答>linux和unix
socket通讯使用select的问题
来源: 互联网 发布时间:2015-08-04
本文导语: 我用select方法在一个套接字上投递了一个读的操作: char *buffer; buffer=NULL; while(1) { ... //设置读 FD_SET(socket, &rset); //如果缓冲区有数据,则发送数据 if(buffer) FD_SET(socket, &wset); ... select(maxfdp1,&rset,&wset,NULL,NULL);//程序在这里...
我用select方法在一个套接字上投递了一个读的操作:
char *buffer;
buffer=NULL;
while(1)
{
...
//设置读
FD_SET(socket, &rset);
//如果缓冲区有数据,则发送数据
if(buffer)
FD_SET(socket, &wset);
...
select(maxfdp1,&rset,&wset,NULL,NULL);//程序在这里阻塞住了
...
}
这个时候如果缓冲区内有了新的数据,我想再投递一个写操作,但是由于没有接收到数据,select语句无法返回,如何才能使select方法在需要的时候返回?
char *buffer;
buffer=NULL;
while(1)
{
...
//设置读
FD_SET(socket, &rset);
//如果缓冲区有数据,则发送数据
if(buffer)
FD_SET(socket, &wset);
...
select(maxfdp1,&rset,&wset,NULL,NULL);//程序在这里阻塞住了
...
}
这个时候如果缓冲区内有了新的数据,我想再投递一个写操作,但是由于没有接收到数据,select语句无法返回,如何才能使select方法在需要的时候返回?
|
timeout!最后一个参数
|
用这句话可以将套接字设为非阻塞型套接字:
fcntl(sockfd, F_SETFL, fcntl(c_sockfd, F_GETFL) | O_NONBLOCK);
fcntl(sockfd, F_SETFL, fcntl(c_sockfd, F_GETFL) | O_NONBLOCK);