overlapped socket

yuanmoren 2012-07-19 11:08:53
我知道WSASocket 可以创建overlapped socket.
但是用accept返回的socket,我要怎么才能保证它是overlapped的?
我怎么查询一个socket是否是overlapped?
...全文
306 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nondeep 2013-01-08
  • 打赏
  • 举报
回复
引用 4 楼 yang79tao 的回复:
accept得到的socket与监听的socket的属性一样。 另外,winsock 1.0版本的函数,创建的socket都是带重叠属性的,WSASocket才有可能创建出不带重叠属性的socket,这一点很多人没搞懂,WSASocket其实默认创建出来的才是不带重叠属性的sokcet,而socket函数默认创建出来的,是带重叠属性的。
这个才是正解!
youngwolf 2012-07-25
  • 打赏
  • 举报
回复
楼上,accept和WSAAccept调用不是你先创建socket的,而是它返回一个socket;
AcceptEx才是你说的情况,需要先创建socket,再调用它。
MingoJ 2012-07-25
  • 打赏
  • 举报
回复
你不用纠结于判断一个socket是否是重叠模式, 因为你创建的时候就设置好了是不是,看下面代码:
// 需要使用重叠IO,必须得使用WSASocket来建立Socket,才可以支持重叠IO操作
m_pListenContext->m_Socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);

看到最后一个参数没有? 那表明创建的是重叠模式的IO
youngwolf 2012-07-24
  • 打赏
  • 举报
回复
accept得到的socket与监听的socket的属性一样。

另外,winsock 1.0版本的函数,创建的socket都是带重叠属性的,WSASocket才有可能创建出不带重叠属性的socket,这一点很多人没搞懂,WSASocket其实默认创建出来的才是不带重叠属性的sokcet,而socket函数默认创建出来的,是带重叠属性的。
dickbarry 2012-07-23
  • 打赏
  • 举报
回复
调用WSAAccept()时会创建一个socket,只是真正的接受connect后,会返回新的有效的socket,这个新的socket实际上就是之前创建的那个socket,只是进行了一些内部设置而已

本质上说,socket IO应该不算是socket的一部分,而是属于异步IO的范畴
yuanmoren 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

WSAAccept()的是
accept的不是
[/Quote]
在msdn上我又没看到明确的说明。
如果可以查询一个socket是否是overlapped那就好了。
dickbarry 2012-07-20
  • 打赏
  • 举报
回复
WSAAccept()的是
accept的不是
重叠IO模型之OverLapped完成例程模型WSACompletionRoutineServer VS2010 基础入门 客户端与服务器端 客户端向服务器端发送数据 可接收多个客户端 #include #include #pragma comment (lib, "ws2_32.lib") #define PORT 8088 #define MSG_SIZE 1024 SOCKET g_sConnect; bool g_bConnect = false; typedef struct { WSAOVERLAPPED overLap; WSABUF wsaBuf; char chMsg[MSG_SIZE]; DWORD nRecvNum; DWORD nFlags; SOCKET sClient; }PRE_IO_OPERATION_DATA, *LP_PER_IO_OPERATION_DATA; void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags); DWORD WINAPI workThread(LPVOID lp) { LP_PER_IO_OPERATION_DATA lpData; while(TRUE) { if (g_bConnect) // 有新的连接 { // 为lpData分配空间并初始化 lpData = (LP_PER_IO_OPERATION_DATA)HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PRE_IO_OPERATION_DATA)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; lpData->sClient = g_sConnect; WSARecv(lpData->sClient, &lpData->wsaBuf, 1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); g_bConnect = false; // 处理完毕 } SleepEx(1000, TRUE); } return 0; } // 系统在WSARecv收到信息后,自动调用此函数,并传入参数--回调函数 void CALLBACK CompletionRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED lpOverlap, DWORD nFlags) { LP_PER_IO_OPERATION_DATA lpData = (LP_PER_IO_OPERATION_DATA)lpOverlap; if (0 != dwError) // 接收失败 { printf("Socket %d Close!\n", lpData->sClient); closesocket(lpData->sClient); HeapFree(GetProcessHeap(), 0, lpData); } else // 接收成功 { lpData->chMsg[dwTrans] = '\0'; send(lpData->sClient, lpData->chMsg, dwTrans, 0); printf("Socket:%d MSG: %s \n", lpData->sClient, lpData->chMsg); memset(&lpData->overLap, 0, sizeof(WSAOVERLAPPED)); lpData->wsaBuf.len = MSG_SIZE; lpData->wsaBuf.buf = lpData->chMsg; // 继续接收来自客户端的数据 实现 WSARecv与CompletionRoutine循环 WSARecv(lpData->sClient, &lpData->wsaBuf,1, &lpData->nRecvNum, &lpData->nFlags, &lpData->overLap, CompletionRoutine); } } int main() { WSADATA wsaData; WSAStartup(0x0202, &wsaData); SOCKET sListen; sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); sockaddr_in addrListen; addrListen.sin_family = AF_INET; addrListen.sin_port = htons(PORT); addrListen.sin_addr.S_un.S_addr = htonl(ADDR_ANY); int nErrorCode = 0; nErrorCode = bind(sListen, (sockaddr*)&addrListen, sizeof(sockaddr)); nErrorCode = listen(sListen, 5); DWORD nThreadID; CreateThread(NULL, 0, workThread, NULL, 0, &nThreadID); sockaddr_in addrConnect; int nAddrLen = sizeof(sockaddr_in); printf("Server Started!\n"); while(TRUE) { g_sConnect= accept(sListen, (sockaddr*)&addrConnect, &nAddrLen); if (INVALID_SOCKET == g_sConnect) { return -1; } g_bConnect = true; // 连接成功 printf("Accept Client :%s -- PORT:%d\n", inet_ntoa(addrConnect.sin_addr), htons(addrConnect.sin_port)); } return 0; }

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧