• 无阻塞情况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;
    }



  • 相关阅读:
    微信JSSDK使用指南
    安装eclipse中html/jsp/xml editor插件以及改动html页面的字体
    OpenLayers 3+Geoserver+PostGIS实现点击查询
    编程算法
    javascript闭包具体解释
    网络安全基本概念
    Android 5.1 Settings源代码简要分析
    Linq 使用注意
    父类引用指向子类对象
    CPU使用率
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4590504.html
Copyright © 2020-2023  润新知