网络的connect如何超时设置?MFC socket异步 timeout select
来源:互联网 发布:python name 编辑:程序博客网 时间:2024/05/16 06:44
这个帖子很精彩:
http://bbs.csdn.net/topics/390416681?page=1
附关键代码:
m_strServerIP = strServerIP;m_nPort = nPort;while( true ){// 创建套接字m_socket = socket(AF_INET,SOCK_STREAM,0);if( m_socket == INVALID_SOCKET )break;// 设置为非阻塞模式DWORD ul = 1;if( 0 != ioctlsocket( m_socket, FIONBIO, &ul) ) break;// 将UNICODE的IP地址转换为多字节字符的IP地址char szServerIP[16] = { 0 };if( WideCharToMultiByte( CP_ACP,0,m_strServerIP,m_strServerIP.GetLength(),szServerIP,sizeof(szServerIP),NULL,NULL ) == 0 )break;// 连接指定的IP地址和端口SOCKADDR_IN sin;sin.sin_family = AF_INET;sin.sin_port = htons(m_nPort);sin.sin_addr.s_addr = inet_addr( szServerIP );if( ! ( SOCKET_ERROR == connect( m_socket, (SOCKADDR *)&sin, sizeof(sin)) && WSAGetLastError() == WSAEWOULDBLOCK ) )break;// 异步connect不会等待就直接返回了,用select的方式来判断connect是否成功,select会阻塞,只到connect连接成功或失败后select才返回fd_set fs_read;FD_ZERO( &fs_read );FD_SET( m_socket,&fs_read );fd_set fs_write;fs_write.fd_count = 1;fs_write.fd_array[0] = m_socket;fd_set fs_error;fs_error.fd_count = 1;fs_error.fd_array[0] = m_socket;int ret = select( 0,&fs_read,&fs_write,&fs_error,NULL );if( ret == SOCKET_ERROR )break;// 判断socket句柄是否可写if( !FD_ISSET( m_socket,&fs_write ) )break;int optval = -1;int optlen = sizeof(optval);ret = getsockopt( m_socket,SOL_SOCKET,SO_ERROR,(char*)(&optval),&optlen );if( ret != 0 || optval != 0)break;// 直到这里connect才是真正成功// 创建监听线程收到消息的事件句柄m_wsaEvent = WSACreateEvent();if( m_wsaEvent == WSA_INVALID_EVENT )break;// 给监听线程的消息到达事件句柄配置要通知的事件类型if( WSAEventSelect( m_socket,m_wsaEvent,FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE ) != 0 )break;// 创建通知监听线程退出的事件句柄m_wsaClose = WSACreateEvent();if( m_wsaClose == WSA_INVALID_EVENT )break;// 创建消息事件监听线程DWORD dwThreadId;m_hThreadEvent = CreateThread( NULL, 0, ThreadProc_SocketEvent, this, 0, &dwThreadId );if( m_hThreadEvent == NULL )break;// 创建定时发送心跳包的事件句柄m_hEventHeartbeat= CreateEvent( NULL,TRUE,FALSE,NULL );if( m_hEventHeartbeat == NULL )break;// 创建定时发送心跳包的线程m_hThreadHeartbeat = CreateThread( NULL,0,ThreadProc_Heartbeat,this,0, &dwThreadId );if( m_hThreadHeartbeat == NULL )break;// 全部创建成功,返回TRUEreturn TRUE;}
0 0
- 网络的connect如何超时设置?MFC socket异步 timeout select
- 网络的connect如何超时设置?MFC socket异步 timeout select
- 如何设置socket的Connect超时(linux)?
- 如何设置socket的Connect超时(linux)
- 如何设置socket的Connect超时(linux)
- 如何设置socket的Connect超时(linux)
- 如何设置socket的Connect超时(linux)
- 如何设置socket的Connect超时(linux)
- 如何设置socket的Connect超时
- 如何设置socket的connect() recvfrom() 超时
- 如何设置socket的Connect超时
- 如何设置socket的Connect超时
- 设置超时,timeout,socket
- 设置socket的Connect超时
- 设置socket的Connect超时
- 设置socket的Connect超时
- 如何设置socket的Connect超时(linux)---转载
- JAVA SOCKET connect超时设置是如何实现的?
- 如何从redis中导出数据
- android annotation 配置
- nine9patch
- apktool反编译工具的使用
- 【Android-实践】检测验证码短信,将验证码自动填入
- 网络的connect如何超时设置?MFC socket异步 timeout select
- C#结合GDAL实现图像加运算
- RED5只能使用NioProcessor-1线程进行处理问题
- Android中Scrollview、ViewPager冲突问题汇总
- Redhat 6.4 安装 Oracle10g 血泪史 - whaon的
- How to invoke maven default lifecycle
- xampp3.2.1安装memcached扩展
- 浅谈搜索引擎
- 纯CSS下拉导航和jquery下拉导航对比