100分求一个用API写的异步非阻塞的简单程序例子?要求不用MFC类就用winsockAPI WSAAsyncSelect就是用这个函数实现最好程序中有些注释最好是用VC写的基于对话框的,这样看起来比较容易 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 要是我就先包装自己的Socket类, 那样会方便了, 可以仿制CAsyncSocket类. 做CAsyncSocket的继承也是很简单的 CAsyncSocket 先给个服务器端的东东WSADATA wsd;SOCKET SockServer;sockaddr_in sin, sout;int len;char chBuf[512] = {0};WSAStartup(MAKEWORD(2,2), &wsd);SockServer = socket(AF_INET, SOCK_STREAM, 0);if (SockServer == INVALID_SOCKET){ return;}memset(&sin, '\0', sizeof(sin));sin.sin_family = AF_INET;sin.sin_port = htons(9999);sin.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(SockServer, (const sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR){ return ;}if (listen(SockServer, 10) == SOCKET_ERROR){ return ;}len = sizeof(sout);SockClient = accept(SockServer, (sockaddr *)&sout, &len);if (SockClient == INVALID_SOCKET){ return 0;}recv(SockClient, chBuf, sizeof(chBuf), 0);WSACleanup(); 请大家看清楚 用API写的 异步非阻塞阻塞的不需要谢谢大家合作 在 asdfghjkl1107(脚右金黄) 的代码中加上setsocketopt()或者select()函数就可以非阻塞 建议直接看MFC中CSocket的实现代码 难道大家都是用MFC类中的类来做socket程序吗?难道就真没人知道吗??难道你们只是喜欢求结果并不想知道里面的实现方法吗??? 使用WSAAsyncSelect不如直接使用mfc,因为它要创建窗口,何况mfc也是用的这个函数,封装的也不错,何必自讨苦吃去重新写一个。如果你真想用异步的,不妨使用WSAEventSelect,或者完成端口也成,感觉要比WSAAsyncSelect好用一些 创建socket就不写了int nOptionioctlsocket(socket, FIONBIO, &n); 呵呵,不好意思,错了.#define WM_ASYNCMSG WM_USER + 0x0044HWND hWndRelavtive;int nOption = 1;int nRet = ioctlsocket(socket, FIONBIO, &nOption);nRet = WSAAsyncSelect(socket, hWndRelative, WM_ASYNCMSG, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);对应的相关窗口中有LRESULT OnAsyncMsg(WPARAM wParam, LPARAM lParam){if(WSAGETSELECTERROR(lParam)){// Error handlerreturn 0L;}switch(WSAGETSELECTEVENT(lParam)){case FD_READ:return OnRead();case FD_WRITE:return OnWrite();case FD_CONNECT:return OnConnect();case FD_ACCEPT:return OnAccept();case FD_CLOSE:return OnClose();case FD_OOB:return OnOOB();break;default:ASSERT(FALSE);break;}return 0L;} 完成端口你懂么?如果不懂就请联系本人[email protected]本人有你需要的东东 http://61.153.195.10:8080/view.asp?file=315下面的一个Chapter16\Chat-TCP是个好列子。 to fbmsf(FBM)你的列子我看了,但都是汇编啊,但还是要谢谢你 少听别人放屁,谁说要多线程,只有阻塞模式才用到多线程!异步先用if(iocltsocket(s,FIONBIO,&cmd)==socket_error) { closesocket(S); …… } 将其设置为非阻塞模型,然后用select函数 再用 swith(select(s,......)) { case 0: //time out case -1: //socket error default: } 就OK了,但要注意定义timeval结构,具体看一下selete函数的介绍吧 楼上的哥哥,你说话太武断了吧?你做完成端口不开线程做给我看看。(期待ing)还有说话注意文明礼貌。用select,你不觉得对于服务器是一种非常浪费资源的做法么?尤其是在windows下的编程 CFile怎么一行一行读取文件? 截获对话框弹出消息 高分征求子对话框绘图问题 http的头部大小限制 怎么得到一个并地的信息呀 COM 组件概念问题请教,谢谢! 哪位大侠能给提供一点关于DLL编程的资料。 请教~~~~~~~` 为什么SetPos不能传参? C++高手解释一下 如何用setsockopt设置recv函数的timeout时间? 50分! 非阻塞套接字如何使用?谁能提供一个C++例子?
那样会方便了, 可以仿制CAsyncSocket类.
SOCKET SockServer;
sockaddr_in sin, sout;
int len;
char chBuf[512] = {0};WSAStartup(MAKEWORD(2,2), &wsd);SockServer = socket(AF_INET, SOCK_STREAM, 0);
if (SockServer == INVALID_SOCKET)
{
return;
}memset(&sin, '\0', sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(9999);
sin.sin_addr.S_un.S_addr = INADDR_ANY;if (bind(SockServer, (const sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR)
{
return ;
}
if (listen(SockServer, 10) == SOCKET_ERROR)
{
return ;
}len = sizeof(sout);
SockClient = accept(SockServer, (sockaddr *)&sout, &len);
if (SockClient == INVALID_SOCKET)
{
return 0;
}recv(SockClient, chBuf, sizeof(chBuf), 0);WSACleanup();
用API写的 异步非阻塞阻塞的不需要
谢谢大家合作
setsocketopt()
或者
select()函数就可以非阻塞
难道就真没人知道吗??
难道你们只是喜欢求结果并不想知道里面的实现方法吗???
ioctlsocket(socket, FIONBIO, &n);
#define WM_ASYNCMSG WM_USER + 0x0044HWND hWndRelavtive;int nOption = 1;
int nRet = ioctlsocket(socket, FIONBIO, &nOption);nRet = WSAAsyncSelect(socket, hWndRelative, WM_ASYNCMSG, FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);
对应的相关窗口中有
LRESULT OnAsyncMsg(WPARAM wParam, LPARAM lParam)
{
if(WSAGETSELECTERROR(lParam))
{
// Error handler
return 0L;
}switch(WSAGETSELECTEVENT(lParam))
{
case FD_READ:
return OnRead();
case FD_WRITE:
return OnWrite();
case FD_CONNECT:
return OnConnect();
case FD_ACCEPT:
return OnAccept();
case FD_CLOSE:
return OnClose();
case FD_OOB:
return OnOOB();
break;
default:
ASSERT(FALSE);
break;
}return 0L;
}
[email protected]
本人有你需要的东东
你的列子我看了,但都是汇编啊,但还是要谢谢你
谁说要多线程,只有阻塞模式才用到多线程!
异步先用if(iocltsocket(s,FIONBIO,&cmd)==socket_error)
{
closesocket(S);
……
}
将其设置为非阻塞模型,然后用select函数
再用 swith(select(s,......))
{
case 0: //time out
case -1: //socket error
default:
}
就OK了,但要注意定义timeval结构,具体看一下selete函数的介绍吧