使用WinSock从服务器读取异步数据

时间:2018-03-29 15:51:05

标签: c++ winapi asynchronous winsock winsock2

我在C ++中使用WinSock API连接并将数据发送到特定服务器(为了提高可读性,所有代码都没有错误处理):

#include <winsock2.h>
#include <Windows.h>

#define PORT 5051

WSADATA WsaData;
WSAStartup(MAKEWORD(2, 2), &WsaData);

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sin;

ZeroMemory(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = inet_addr("Some valid IP");

connect(s, (sockaddr *) &sin, sizeof(sin));

string sdata_out = "Something like GET request\n";
send(s, sdata_out.c_str(), sdata_out.size(), 0);

服务器将开始发送响应,以不同的时间段分隔。它会在没有我的额外请求的情况下发送回复。

我需要异步读取这些数据(不是recv()函数的循环)。 我尝试使用WSAEventSelect()监听本地套接字,如下所示:

SOCKET sloc = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
SOCKADDR_IN sinloc;

ZeroMemory(&sinloc, sizeof(sinloc));
sinloc.sin_family = AF_INET;
sinloc.sin_port = htons(PORT);
sinloc.sin_addr.s_addr = INADDR_ANY;

WSAEventSelect(sloc, EventArray[EventTotal - 1], FD_ACCEPT | 
    FD_CLOSE | FD_READ | FD_CONNECT) == SOCKET_ERROR)

bind(sloc, (sockaddr *)&sinloc, sizeof(sinloc));

listen(sloc, 5));

我不知道该怎么做。我试过following this example,但我的程序在运行时遇到了这段代码:

DWORD Event = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE)

有什么问题?我的事件处理函数应该如何看?或者,我正在做一些根本错误的事情吗?如果我不知道数据何时到来,是否有正确的方法从服务器异步读取数据?

0 个答案:

没有答案