zoukankan      html  css  js  c++  java
  • 无阻塞情况connect生产EINPROGRESS错

    今天的游戏开发client测试程序,非常多,因为出现client。后connect成功。代码证recv系统调用。后来发现,可能是由于socket默认模式被阻止,这将使很多client

    接处于链接却不能数据传输状态。


    后来改动socket为非堵塞模式,但在connect的时候,发现返回值为-1,刚開始以为是connect出现错误,但在server上看到了链接是ESTABLISED状态。

    证明链接是成功的

    但为什么会出现返回值是-1呢? 经过查询资料,以及看stevens的APUE,也发现有这么一说。


    当connect在非堵塞模式下,会出现返回-1值。错误码是EINPROGRESS,但怎样推断connect是联通的呢?stevens书中说明要在connect后,继续推断该socket是否可写?


    若可写,则证明链接成功。怎样推断可写,有2种方案,一种是select推断是否可写,二用poll模型。


    select:

    int CheckConnect(int iSocket)
    {
    fd_set rset;

    FD_ZERO(&rset);
    FD_SET(iSocket, &rset);

    timeval tm;
    tm. tv_sec = 0;
    tm.tv_usec = 0;

    if ( select(iSocket + 1, NULL, &rset, NULL, &tval) <= 0)
    {
        close(iSocket);
        return -1;
    }

    if (FD_ISSET(iSocket, &rset))
    {
        int err = -1;
        socklen_t len = sizeof(int);
    if ( getsockopt(iSocket,  SOL_SOCKET, SO_ERROR ,&err, &len) < 0 )
    {
        close(iSocket);
        printf("errno:%d %s ", errno, strerror(errno));
        return -2;
    }

    if (err)
    {
        errno = err;
        close(iSocket);
       
      return -3;
    }
    }

    return 0;
    }


    poll:

    int CheckConnect(int iSocket) {
    	struct pollfd fd;
    	int ret = 0;
    	socklen_t len = 0;
    
    	fd.fd = iSocket;
    	fd.events = POLLOUT;
    
    	while ( poll (&fd, 1, -1) == -1 ) {
    		if( errno != EINTR ){
    			perror("poll");
    			return -1;
    		}
    	}
    
    	len = sizeof(ret);
    	if ( getsockopt (iSocket, SOL_SOCKET, SO_ERROR, &ret, &len) == -1 ) {
        	        perror("getsockopt");
    		return -1;
    	}
    
    	if(ret != 0) {
    		fprintf (stderr, "socket %d connect failed: %s
    ",
                     iSocket, strerror (ret));
    		return -1;
    	}
    
    	return 0;
    }



  • 相关阅读:
    MD5算法--网盘秒传
    无线网络定位算法综述
    android学习---异步任务(AsyncTask)
    python中局部变量的定义
    python3里函数怎么样使用元组或字典作为参数调用(复制他人博客)
    调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一
    Linux入门之——安装虚拟机软件
    Linux学习方法之以始为终—Linux工作分类
    Linux基础系列—Linux内核源码目录结构
    Linux基础系列—Linux体系结构和Linux内核结构
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4590504.html
Copyright © 2011-2022 走看看