无阻塞情况connect生产EINPROGRESS错[通俗易懂]

无阻塞情况connect生产EINPROGRESS错[通俗易懂]今天的游戏开发client测试程序,非常多,因为出现client。后connect成功。代码证recv系统调用。后来发现,可能是由于socket默认模式被阻止,这将使很多client接处于链接却不能数据传输状态。后来改动socket为非堵塞模式,但在connect的时候,发现返回值为-1,刚開始以为是connect出现错误,但在server上看到了链接是ESTABLISED…

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

今天的游戏开发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\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/160554.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月16日 下午10:46
下一篇 2022年7月16日 下午11:00


相关推荐

  • Vue文件上传、下载

    Vue文件上传、下载代码示例:文件上传到接口,对接口返回的文件进行下载。<template><divclass=”hello”><h1>{{msg}}</h1><inputtype=”file”@change=”uploadFile($event)”accept=”.sql,.excel,.txt”/></div></template><script>exportdefau

    2022年6月16日
    47
  • phpstorm2021.3激活码(在线激活)

    phpstorm2021.3激活码(在线激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    190
  • win10 directshow无法释放_windowmode

    win10 directshow无法释放_windowmode现在单独的directshowsdk包已经没有了,从directx9.0c开始directshow和directx分开发布,现在的directshow已经集成到windowsSDK当中了,不需要单独安装。

    2022年10月12日
    8
  • java Object转List

    java Object转ListjavaObject 转 List

    2026年3月19日
    3
  • vscode怎么html和php混编,vscode如何编译运行html文件[通俗易懂]

    vscode怎么html和php混编,vscode如何编译运行html文件[通俗易懂]首先打开我们的VSCode软件,然后新建一个HTML文件,注意,在VSCode软件里面新建一个文件,它的后缀名也必须写上这时候我们写好HTML内容之后,鼠标右键,发现没有运行HTML文件的按钮我们需要点击VSCode软件左边的“扩展”,或者同时按住键盘上的Ctrl+shift+I键进入“扩展”界面进入“扩展”界面之后,我们在搜索框内输入“open”,然后找到“openinbrowser…

    2022年8月21日
    14
  • Android手机的像素密度(dpi)计算

    Android手机的像素密度(dpi)计算(1)分辨率。分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。(2)屏幕大小。屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸,5寸×2.54厘米/寸=12.7厘米。…

    2022年5月29日
    50

发表回复

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

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