当前位置:  技术问答>linux和unix

一个关于poll中accpet的问题

    来源: 互联网  发布时间:2017-04-04

    本文导语:  在网上看到这样的一个说法: 当一个已完成的连接准备好被accept的时候,select会把监听socket标记为可读。因此,如果用select等待外来的连接时,应该不需要把监听socket设置为非阻塞模式,因为如果select告诉我们连接...

在网上看到这样的一个说法:
当一个已完成的连接准备好被accept的时候,select会把监听socket标记为可读。因此,如果用select等待外来的连接时,应该不需要把监听socket设置为非阻塞模式,因为如果select告诉我们连接已经就绪,accept就不应该被阻塞。不过这样做的时候有一个BUG:当客户端在跟服务器建立连接之后发送了一个RST包,这个时候accept就会阻塞,直到有下一个已完成的连接准备好被accept为止。
struct linger的l_onoff标志设为1,l_linger设为0。这个时候,如果关闭TCP连接时,会先在socket上发送一个RST包。这个时候会出现下面的问题:
A:select向服务器返回监听socket可读,但是服务器要在一段时间之后才能调用accept;
B:在服务器从select返回和调用accept之前,收到从客户发送过来的RST;
C:这个已经完成的连接被从队列中删除,我们假设没有其它已完成的连接存在;
D:服务器调用accept,但是由于没有其它已完成的连接存在,因而服务器被阻塞了;
注意,服务器会被一直阻塞在accept调用上,直到另外一个客户建立一个连接为止;但是如果一直没有其它客户建立连接,那么服务器将仍然一直被阻塞在accept调用上,不处理任何其他已就绪的socket;
解决这个问题的办法是:
A:如果使用select来获知何时有链接已就绪可以accept时,总是把监听socket设置为非阻塞模式,并且
B:在后面的accept调用中忽略以下错误:EWOULDBLOCK(源自Berkeley的实现在客户放弃连接时出现的错误)、ECONNABORTED(Posix.1g的实现在客户放弃连接时出现的错误)、EPROTO(SVR4的实现在客户放弃连接时出现的错误)和EINTR(如果信号被捕获).

现在代码如下:
服务端

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  
#include 

typedef struct 
{
char info[1024];
    char name[20];
int  id;
}STU;

#define MAXLINE 1024
#define SERV_PORT 9988

#define CTRLVA 1

ssize_t Readline(int fd, void *buf, size_t num);
ssize_t writen(int fd, const void *vptr, size_t n);

/*设置为非阻塞*/
static int setnonblocking(int sock)
{
    int opts;
opts = fcntl(sock, F_GETFL);
if (opts 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util类linkedlist<e>的类成员方法: poll定义及介绍
  • 哪位能详细介绍一下poll的用法,感觉man poll说得不够清晰
  • java命名空间java.util接口queue<e>的类成员方法: poll定义及介绍
  • 应用层获得SIGIO信号如何区分是kill_fasync(poll_in)或kill_fasync(poll_out)产生的
  • java命名空间java.util类priorityqueue<e>的类成员方法: poll定义及介绍
  • tuxedo客户端调用的tpacall返回的fd是否支持poll?
  • java命名空间java.util类arraydeque<e>的类成员方法: poll定义及介绍
  • 如何让poll函数永久阻塞
  • java命名空间java.util.concurrent类priorityblockingqueue<e>的类成员方法: poll定义及介绍
  • poll_wait无法阻塞是什么原因造成的?
  • java命名空间java.util.concurrent类concurrentlinkedqueue<e>的类成员方法: poll定义及介绍
  • 怎么用poll检查设备是否有数据?还有fsync怎么用?
  • java命名空间java.util接口deque<e>的类成员方法: poll定义及介绍
  • Ajax投票程序 Ajax Poll
  • java命名空间java.util.concurrent接口blockingdeque<e>的类成员方法: poll定义及介绍
  • poll为什么不返回?
  • java命名空间java.util.concurrent接口completionservice<v>的类成员方法: poll定义及介绍
  • 中断和polling的区别?
  • java命名空间java.util.concurrent类synchronousqueue<e>的类成员方法: poll定义及介绍
  • 请教高人来解释一下小弟关于poll()函数的疑惑
  • java命名空间java.util.concurrent类delayqueue<eextendsdelayed>的类成员方法: poll定义及介绍
  • @@请教poll模式和select中的FD_SETSIZE


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,