关于WSAEventSelect,为什么FD_WRITE事件只响应一次啊,大家帮我看看。。。。

saliengu saliengu 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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的路由性质是一样的,根据路由规则(路径)从一个界面跳转到另外一个界面的规则。也就是通常理解的路由指的是分组数据包从源头到目的地时候,决定端到端路径的网络范围的进程,这

三掌柜666

wsaEventSelect事件选择模型

- `lNetworkEvents`: 指定需要监视的网络事件,如FD_READ、FD_WRITE、FD_ACCEPT、FD_CONNECT等。

qq_35728402

WSAEventSelect模型

- `lNetworkEvents`: 指定要监控的事件类型,如FD_READ(可读)、FD_WRITE(可写)、FD_ACCEPT(有新的连接请求)、FD_CLOSE(套接字关闭)等。### 2.

DuelOMH

windowsSocket-WSAEventSelect.rar_WSAEventSelect_windows WSAEVENT

**使用步骤:** - **选择事件:**调用WSAEventSelect,指定套接字、事件对象和感兴趣的事件类型(如FD_READ、FD_WRITE等)。

Janice Lu
评论 8
收藏 已收藏
分享
返回顶部
saliengu
网络编程 18,356 成员 64,161 内容