ios之EINPROGRESS错误[通俗易懂]

ios之EINPROGRESS错误[通俗易懂]今天在ios建立socket时报了这个错误:EINPROGRESS,但是socket已经连接。socket为非阻塞模式,但在connect的时候,发现返回值为-1,刚开始以为是connect出现错误,但在服务器上看到了链接是ESTABLISED状态。证明链接是成功的但为什么会出现返回值是-1呢?经过查询资料,以及看stevens的APUE,也发现有这么一说。当connect在非阻

大家好,又见面了,我是你们的朋友全栈君。

今天在ios建立socket时报了这个错误:EINPROGRESS,但是socket已经连接。

socket为非阻塞模式,但在connect的时候,发现返回值为-1,刚开始以为是connect出现错误,但在服务器上看到了链接是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\n”, 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\n",
                 iSocket, strerror (ret));
		return -1;
	}

	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/160535.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • openGL之API学习(六十九)水平同步 垂直同步「建议收藏」

    openGL之API学习(六十九)水平同步 垂直同步「建议收藏」垂直和水平是CRT中两个基本的同步信号,水平同步信号决定了CRT画出一条横越屏幕线的时间,垂直同步信号决定了CRT从屏幕顶部画到底部,再返回原始位置的时间,而恰恰是垂直同步代表着CRT显示器的刷新率水平!垂直同步打开,那么在游戏中,或许强劲的显卡迅速的绘制完一屏的图像,但是没有垂直同步信号的到达,显卡无法绘制下一屏,只有等垂直同步信号到达,才可以绘制。这样fps自然要受到操作系统刷新率运行值的…

    2022年5月21日
    34
  • 6hutool实战:DateUtil(时间工具类)-时间偏移量获取

    6hutool实战:DateUtil(时间工具类)-时间偏移量获取hutool 实战 包含但不限于获取年 季度 月 周 日 时 分 秒 毫秒的开始时间和结束时间 关键字 javajavaJAVA 工具类工具类工具类 DateUtilDate

    2025年10月21日
    5
  • c++怎么把小写字母变成大写字母_int能直接转化为char类型吗

    c++怎么把小写字母变成大写字母_int能直接转化为char类型吗1、输出uint32_tuint32_ta=888;printf(“ais%ld”,a);2、输出uint64_tuint64_tb=888;printf(“bis%lu”,b);printf(“bis%lld”,b);3、输出16进制intc=16;printf(“cis0x%08x”,c)

    2025年9月29日
    4
  • delphi 单引号用quotedstr()就是爽

    delphi 单引号用quotedstr()就是爽sp_qry.Close;  sp_qry.SQL.Clear;  sp_qry.SQL.Add(‘select*fromitem_infowhereitem_clsno=’+quotedstr(sp_lb.KeyValue));  sp_qry.Open; 用quotedstr()函数不用去算””个数

    2022年10月9日
    3
  • 【C#】创建、解析 xml 文件(XmlDocument 方式)

    【C#】创建、解析 xml 文件(XmlDocument 方式)前言本文使用System.Xml中的XmlDocument解析xml格式的文件。另外,由于我是粗略的看了下官方文档和一些博客,可能会有许多错误的地方,望指出。官方文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.xml.xmldocument?view=netframework-4.8文章时间:写于2019-7-17…

    2022年6月19日
    26
  • 数组访问越界_数组越界会导致什么问题

    数组访问越界_数组越界会导致什么问题什么是数组访问越界?所谓的数组越界,简单地讲就是指数组下标变量的取值超过了初始定义时的大小,导致对数组元素的访问出现在数组的范围之外,这类错误也是C语言程序中最常见的错误之一。在C语言中,数组必须是静态的。换而言之,数组的大小必须在程序运行前就确定下来。由于C语言并不具有类似Java等语言中现有的静态分析工具的功能,可以对程序中数组下标取值范围进行严格检查,一旦发现数组上溢或下溢,都会因抛出异常而终止程序。也就是说,C语言并不检验数组边界,数组的两端都有可能越界,从而使其他变量的数据甚

    2022年10月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号