服务端
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")#include <iostream>
using namespace std;
#define MAXDATASIZE 200
typedef struct
{
OVERLAPPED OverLappe;
WSABUF DataBuf;
char buffer[MAXDATASIZE];
DWORD BytesSEND, BytesRECV;
}PER_IO_OPERATION_DATA, * LPPER_IO_OPERATION_DATA;
typedef struct
{
SOCKET Sock;
}PER_HANDLE_DATA, * LPPER_HANDLE_DATA;
DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
HANDLE CompletionPort = (HANDLE)CompletionPortID;
DWORD BytesTransferred;
LPOVERLAPPED OverLapp;
LPPER_IO_OPERATION_DATA PerIOData;
LPPER_HANDLE_DATA PerHandleData;
DWORD SendBytes, RecvBytes, Flags;
while (true)
{
BOOL Ret = GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
(PULONG_PTR)&PerHandleData, (LPOVERLAPPED*)&PerIOData, INFINITE);
if (Ret == 0)
{
cout << "GetQueuedCompletionStatus() failed with error " << GetLastError() << endl;
return 0;
}
if (BytesTransferred == 0)
{
cout << "Closing socket " << PerHandleData->Sock << endl;
if (closesocket(PerHandleData->Sock) == 0)
{
cout << "closesocket() failed with error " << GetLastError() << endl;
return 0;
}
GlobalFree(PerHandleData);
GlobalFree(PerIOData);
continue;
}
if (PerIOData->BytesRECV == 0)
{
PerIOData->BytesRECV = BytesTransferred;
PerIOData->BytesSEND = 0;
}
else
{
PerIOData->BytesSEND += BytesTransferred;
}
if (PerIOData->BytesRECV > PerIOData->BytesSEND)
{
ZeroMemory(&(PerIOData->OverLappe), sizeof(OVERLAPPED));
PerIOData->DataBuf.buf = P