关于WSAEventSelect,为什么FD_WRITE事件只响应一次啊,大家帮我看看。。。。
int main(int argc, char* argv[])
{
WSADATA wd = { 0 };
WSAStartup( MAKEWORD( 2, 0 ), &wd );
//
// Create a TCP/IP stream socket
//
SOCKET Socket;
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == INVALID_SOCKET)
{
printf("socket failed,error=%d",WSAGetLastError());
return 0;
}
//
// Create an event object to be used with this socket
//
WSAEVENT hEvent;
hEvent = WSACreateEvent();
if (hEvent == WSA_INVALID_EVENT)
{
printf("WSACreateEvent() Failed,error=%d",GetLastError());
closesocket(Socket);
return 0;
}
//
// Make the socket non-blocking and
// associate it with network events
//
int nRet;
nRet = WSAEventSelect(Socket,
hEvent,
FD_READ|FD_WRITE|FD_CLOSE);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("EventSelect()");
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}
//
// Lookup host
//
// Fill in the server address structure
//
SOCKADDR_IN sa;
sa.sin_family = AF_INET;
sa.sin_addr.S_un.S_addr =inet_addr("192.168.0.2");
sa.sin_port = htons(700); // Well-known HTTP port
//
// Request a connection
//
nRet = connect(Socket,
(LPSOCKADDR)&sa,
sizeof(SOCKADDR_IN));
if (nRet == SOCKET_ERROR)
{
nRet = WSAGetLastError();
if (nRet == WSAEWOULDBLOCK)
{
fprintf(stderr,"\nConnect would block");
}
else
{
PRINTERROR("connect()");
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}
}
//
// Handle async network events
//
char szBuffer[256];
strcpy(szBuffer,"hello");
WSANETWORKEVENTS events;
while(1)
{
//
// Wait for something to happen
//
fprintf(stderr,"\nWaitForMultipleEvents()");
DWORD dwRet;
dwRet = WSAWaitForMultipleEvents(1,
&hEvent,
FALSE,
WSA_INFINITE,
FALSE);
if (dwRet == WSA_WAIT_TIMEOUT)
{
fprintf(stderr,"\nWait timed out");
break;
}
//
// Figure out what happened
//
fprintf(stderr,"\nWSAEnumNetworkEvents()");
nRet = WSAEnumNetworkEvents(Socket,
hEvent,
&events);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("WSAEnumNetworkEvents()");
break;
}
// //
// Handle events //
// //
// Connect event?
if (events.lNetworkEvents & FD_CONNECT)
{
fprintf(stderr,"\nFD_CONNECT: %d",
events.iErrorCode[FD_CONNECT_BIT]);
// nRet = send(Socket, szBuffer, strlen(szBuffer), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("send()");
break;
}
}
// Read event?
if (events.lNetworkEvents & FD_READ)
{
// Read the data and write it to stdout
char buf[256];
memset(buf,0,sizeof(buf));
nRet = recv(Socket, buf, sizeof(buf), 0);
if (nRet == SOCKET_ERROR)
{
PRINTERROR("recv()");
break;
}
printf("\n");
printf(buf);
// send(Socket,szBuffer,strlen(szBuffer),0);
}
// Close event?
if (events.lNetworkEvents & FD_CLOSE)
{
fprintf(stderr,"\nFD_CLOSE: %d",
events.iErrorCode[FD_CLOSE_BIT]);
break;
}
// Write event?
if (events.lNetworkEvents & FD_WRITE)
{
send(Socket,szBuffer,strlen(szBuffer),0);
}
nRet = WSAEventSelect(Socket,
hEvent,
FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
}
closesocket(Socket);
WSACloseEvent(hEvent);
return 0;
}
...全文
相关推荐
WSAEventSelect事件选择网络模型
- `lNetworkEvents`:一个位掩码,定义要监听的网络事件,如FD_READ、FD_WRITE、FD_OOB等。
微信小程序开发:路由跳转以及传参的使用
前言 微信小程序开发中的大部分知识点和前端开发是一模一样的,就算具体的语法不一样,但是套路都是一样的,可以说微信小程序开发和前端开发使用的知识点基本一致。本篇博文就来分享一下在微信小程序开发中必用的知识点——路由,微信小程序中的路由使用原理和前端JS的路由使用类似,只是具体的使用语法不一样罢了。 路由的定义 微信小程序的路由和前端JS的路由性质是一样的,根据路由规则(路径)从一个界面跳转到另外一个界面的规则。也就是通常理解的路由指的是分组数据包从源头到目的地时候,决定端到端路径的网络范围的进程,这
wsaEventSelect事件选择模型
- `lNetworkEvents`: 指定需要监视的网络事件,如FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT等。
WSAEventSelect模型
- `lNetworkEvents`: 指定要监控的事件类型,如FD_READ(可读)、FD_WRITE(可写)、FD_ACCEPT(有新的连接请求)、FD_CLOSE(套接字关闭)等。### 2.
windowsSocket-WSAEventSelect.rar_WSAEventSelect_windows WSAEVENT
**使用步骤:** - **选择事件:**调用WSAEventSelect,指定套接字、事件对象和感兴趣的事件类型(如FD_READ、FD_WRITE等)。


网络编程
