天天看点

重叠IO二

// Overlpped_Server2.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <Winsock2.h>

#include <Windows.h>

#include <process.h>

#pragma comment(lib, "WS2_32.lib")

#define MAX_BUFFER 256

#define MAX_TIMEOUT 1000

typedef enum _OPERATION_INFO

{

OP_NULL,

OP_READ,

OP_WRITE

}OPERATIONINFO;

typedef struct _OVERLAPPED_INFO_

public:

_OVERLAPPED_INFO_()

Clean();

}

~_OVERLAPPED_INFO_()

protected:

void Clean()

ol.hEvent = NULL;

sock = INVALID_SOCKET;

memset(&addr, 0, sizeof(addr));

addr.sin_addr.S_un.S_addr = INADDR_ANY;

addr.sin_family = AF_INET;

addr.sin_port = htons(0);

wsaBuf.buf = szBuf;

wsaBuf.len = MAX_BUFFER;

memset(szBuf, 0, sizeof(szBuf));

dwTrans = 0;

dwFlags = 0;

nOpType = OP_NULL;

WSAOVERLAPPED ol;

SOCKET sock;

SOCKADDR_IN addr;

WSABUF wsaBuf;

char szBuf[MAX_BUFFER];

DWORD dwTrans;

DWORD dwFlags;

OPERATIONINFO nOpType;

}OVERLAPPEDINFO, *POVERLAPPEDINFO;

unsigned __stdcall ThreadProc(LPVOID lParam);

void CALLBACK CompleteRoutine(DWORD dwError, DWORD dwTrans, LPWSAOVERLAPPED Overlppad, DWORD dwFlags);

BOOL bExitThread = FALSE;

int g_nIndex = 0;

OVERLAPPEDINFO* g_ol[WSA_MAXIMUM_WAIT_EVENTS] = {0};

int _tmain(int argc, _TCHAR* argv[])

WSADATA wsaData;

if(0 != WSAStartup(MAKEWORD(2, 2), &wsaData))

printf("WSAStartup failed with error: %d/n", GetLastError());

return EXIT_FAILURE;

if(2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))

printf("Socket version not supported./n");

WSACleanup();

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(INVALID_SOCKET == sock)

printf("socket failed with error code: %d/n", WSAGetLastError());

SOCKADDR_IN addr = {0};

addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

addr.sin_port = htons(5050);

if(SOCKET_ERROR == bind(sock, (LPSOCKADDR)&addr, sizeof(addr)))

printf("bind failed with error code: %d/n", WSAGetLastError());

closesocket(sock);

if(SOCKET_ERROR == listen(sock, 5))

printf("listen failed with error code: %d/n", WSAGetLastError());

HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, NULL, 0, NULL);

SOCKADDR_IN remote = {0};

int len = sizeof(remote);

printf("Server start, wait for client to connect .../n");

while(TRUE)

SOCKET sNew = accept(sock, (LPSOCKADDR)&remote, &len);

if(INVALID_SOCKET == sNew)

printf("accept failed with error code: %d/n", WSAGetLastError());

continue;

printf("Client

继续阅读