熟悉事件模型进来帮忙看看

ppzine 2006-10-19 04:14:49

WSAEVENT events[WSA_MAXIMUM_WAIT_EVENTS];
int totalevent=0;

SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
unsigned long val = 0;

if(ioctlsocket(sock,FIONBIO,&val)<0)
{
printf("ioctl failed\n");
closesocket(sock);
return 0;
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr=inet_addr("192.168.1.193");
addr.sin_port=htons(7890);
addr.sin_family=AF_INET;

if(connect(sock,(sockaddr*)&addr,sizeof(sockaddr_in))==SOCKET_ERROR)
printf("connect failed\n");

WSAEVENT event=::WSACreateEvent();
WSAEventSelect(sock,event,FD_READ|FD_WRITE|FD_CLOSE);
events[totalevent]=event;
totalevent++;


while(true)
{
int nindex=::WSAWaitForMultipleEvents(totalevent,events,false,2000,false);
if(nindex==WSA_WAIT_TIMEOUT)
{
continue;
}
else if(nindex==WSA_WAIT_FAILED)
{
continue;
}
else
{

WSANETWORKEVENTS netevent;
if(WSAEnumNetworkEvents(sock,events[nindex-WSA_WAIT_EVENT_0],&netevent)==0)
{

if(netevent.lNetworkEvents & FD_READ)
{
if(netevent.iErrorCode[FD_READ_BIT]!=0)
{
printf("read failed\n");
}
printf("read\n");
}
if(netevent.lNetworkEvents & FD_WRITE)
{
if(netevent.iErrorCode[FD_WRITE_BIT]!=0)
{
printf("write failed\n");
}
printf("write\n");
send(sock,"aa",2,0);
}
if(netevent.lNetworkEvents & FD_CLOSE)
{
if(netevent.iErrorCode[FD_CLOSE_BIT]!=0)
{
printf("close failed\n");
}
printf("close\n");
closesocket(sock);
::WSACloseEvent(events[nindex-WSA_WAIT_EVENT_0]);
}
}
else
{
printf("enumevent failed\n");
}
}
}
system("pause");
return 0;
}
服务器是为了测试写的,就是接收到请求后,新建一个socket,并放入一个新线程保持这个socket的连接.
程序运行后,首先打印出write,按我的理解是可写了,但是接下来在也不返回可写事件了,那么我怎么通过循环证明,这个socket一直可写,并写入数据呢.
...全文
102 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ppzine 2006-10-23
  • 打赏
  • 举报
回复
昨天,又看了看书,与楼上的请的一样,谢谢
baojian88888 2006-10-21
  • 打赏
  • 举报
回复
你可以一直send,直到send失败返回WSAEWOULDBLOCK错误,然后就不再send了,就等FD_WRITE,等到后接着send

18,356

社区成员

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

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