18,363
社区成员




#pragma warning(disable:4996)
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
#define MAX_BUFFER_SIZE 2048
typedef enum
{
IO_NONE,
IO_READ,
IO_WRITE
}IO_OPERATION_INFO, *LPIO_OPERATION_INFO;
typedef struct
{
SOCKET CurrentSocket;
} PER_HANDLE_DATA, *LPPER_HANDLE_DATA;
typedef struct
{
WSAOVERLAPPED Overlapped;
CHAR Buffer[MAX_BUFFER_SIZE];
WSABUF WSABuffer;
//SOCKET CurrentSocket;
SOCKADDR_IN CurrentRemoteAddr;
IO_OPERATION_INFO OperationType;
} PER_IO_DATA, *LPPER_IO_DATA;
unsigned __stdcall ServerWorkerThread(LPVOID CompletionPortID)
{
HANDLE hCompletionPort = (HANDLE)CompletionPortID;
while(TRUE)
{
DWORD dwByteTransferred = 0;
DWORD dwFlag = 0;
LPPER_IO_DATA lpData = NULL;
LPWSAOVERLAPPED lpOverlapped = NULL;
LPPER_HANDLE_DATA lpHandleData = NULL;
cout << "hCompletionPort:" << hCompletionPort << endl;
BOOL state = GetQueuedCompletionStatus(hCompletionPort,
&dwByteTransferred,
(PULONG_PTR)&lpHandleData,
&lpOverlapped,
INFINITE);
if(!state)
{
cout << "GetQueuedCompletionStatus操作失败!"
<< WSAGetLastError() << endl;
continue;
}
lpData = CONTAINING_RECORD(lpOverlapped, PER_IO_DATA, Overlapped);
if(dwByteTransferred == 0)
{
cout << "发过来的数据长度为0" << endl;
closesocket(lpHandleData->CurrentSocket);
delete lpData;
lpData = NULL;
delete lpOverlapped;
lpOverlapped = NULL;
continue;
}
switch (lpData->OperationType)
{
case IO_READ:
{
char *ip = inet_ntoa(lpData->CurrentRemoteAddr.sin_addr);
u_short port = ntohs(lpData->CurrentRemoteAddr.sin_port);
cout << "IO_READ_客户连接地址:" << ip << "。端口:" << port;
cout << "。已接收到数据:" << lpData->Buffer << endl;
lpData->OperationType = IO_WRITE;
memset(
&(lpData->Overlapped), 0,
sizeof(lpData->Overlapped));
/*cout << "Socket:" << &lpData->CurrentSocket << endl;
cout << "WSABuffer:" << &lpData->WSABuffer << endl;
cout << "dwByteTransferred:" << dwByteTransferred << endl;
cout << "dwFlag:" << dwFlag << endl;
cout << "lpData->Overlapped:" << &lpData->Overlapped << endl;
cout << endl;*/
int ret = WSASend(
lpHandleData->CurrentSocket,
&(lpData->WSABuffer), 1,
&dwByteTransferred, dwFlag,
&(lpData->Overlapped), NULL);
if(ret == SOCKET_ERROR)
{
if(WSA_IO_PENDING != WSAGetLastError())
{
/*closesocket(lpData->CurrentSocket);
if(lpData != NULL)
{
delete lpData;
lpData = NULL;
}*/
cout << "is not WSA_IO_PENDING!" << endl;
continue;
}
}
}
break;
case IO_WRITE:
{
cout << "IO_WRITE" << endl;
cout << endl;
lpData->OperationType = IO_READ;
dwFlag = 0;
memset(&lpData->Overlapped, 0, sizeof(lpData->Overlapped));
memset(lpData->Buffer, 0, sizeof(lpData->Buffer));
lpData->WSABuffer.buf = lpData->Buffer;
dwByteTransferred = lpData->WSABuffer.len = MAX_BUFFER_SIZE;
int ret = WSARecv(lpHandleData->CurrentSocket,
&(lpData->WSABuffer), 1,
&dwByteTransferred,
&dwFlag,
&(lpData->Overlapped), NULL);
if(ret == SOCKET_ERROR)
{
if(WSA_IO_PENDING != WSAGetLastError())
{
/*closesocket(lpData->CurrentSocket);
delete lpData;
lpData = NULL;*/
continue;;
}
}
}
break;
default:
break;
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
if(0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
{
printf("WSAStartup failed with error code: %d/n", GetLastError());
return EXIT_FAILURE;
}
if(2 != HIBYTE(wsaData.wVersion) || 2 != LOBYTE(wsaData.wVersion))
{
WSACleanup();
return EXIT_FAILURE;
}
HANDLE hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
int ThreadCount = SysInfo.dwNumberOfProcessors;
HANDLE hThreadHandles[2];
for (int i = 0; i < ThreadCount; i++)
{
//DWORD dwThreadId;
//hThreadHandles[i] = CreateThread(NULL, 0, ServerWorkerThread, (LPVOID)hCompletionPort, 0, &dwThreadId);
hThreadHandles[i] = (HANDLE)_beginthreadex(NULL, 0, ServerWorkerThread, (LPVOID)hCompletionPort, 0, NULL);
}
SOCKET mainSocket = WSASocket(
AF_INET, SOCK_STREAM,
IPPROTO_TCP, NULL, 0,
WSA_FLAG_OVERLAPPED);
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(5600);
bind(mainSocket, (PSOCKADDR)&server, sizeof(server));
listen(mainSocket, 5);
while (TRUE)
{
SOCKADDR_IN remote;
memset(&remote, 0, sizeof(SOCKADDR_IN));
int len = sizeof(SOCKADDR_IN);
SOCKET aptSocket = WSAAccept(
mainSocket,
(LPSOCKADDR)&remote,
&len, NULL, NULL);
if(aptSocket == INVALID_SOCKET)
{
continue;
}
LPPER_IO_DATA lpData = new PER_IO_DATA;
//lpData->CurrentSocket = aptSocket;
LPPER_HANDLE_DATA lpHandleData = new PER_HANDLE_DATA;
lpHandleData->CurrentSocket = aptSocket;
lpData->CurrentRemoteAddr = remote;
memset(&lpData->Overlapped, 0, sizeof(WSAOVERLAPPED));
memset(&lpData->Buffer, 0, MAX_BUFFER_SIZE);
lpData->WSABuffer.buf = lpData->Buffer;
lpData->WSABuffer.len = MAX_BUFFER_SIZE;
lpData->OperationType = IO_READ;
CreateIoCompletionPort(
(HANDLE)aptSocket,
hCompletionPort,
(ULONG_PTR)lpHandleData, 0);
DWORD dwRecvNumBytes=lpData->WSABuffer.len, dwFlags=0;
int ret = WSARecv(lpHandleData->CurrentSocket,
&(lpData->WSABuffer), 1,
&dwRecvNumBytes, &dwFlags,
&(lpData->Overlapped),
NULL);
if(ret == SOCKET_ERROR)
{
if(WSA_IO_PENDING != WSAGetLastError())
{
closesocket(aptSocket);
delete lpData;
lpData= NULL;
}
}
}
PostQueuedCompletionStatus(hCompletionPort, 0, NULL, NULL);
WaitForMultipleObjects(ThreadCount, hThreadHandles, TRUE, INFINITE);
for (int i=0; i<ThreadCount; i++)
{
CloseHandle(hThreadHandles[i]);
}
CloseHandle(hCompletionPort);
closesocket(mainSocket);
WSACleanup();
return 0;
}
// IOCPClient.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WinSock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
SOCKET g_ServerSocket = INVALID_SOCKET;
{ // Init winsock2
WSADATA wsaData;
memset(&wsaData, 0, sizeof(WSADATA));
int retVal = -1;
if( (retVal = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0 ) {
cout << "WSAStartup Failed::Reason Code::"<< retVal << endl;
return 0;
}
}
{ // Create socket
g_ServerSocket = WSASocket(AF_INET,SOCK_STREAM, IPPROTO_TCP, NULL,0,WSA_FLAG_OVERLAPPED);
if( g_ServerSocket == INVALID_SOCKET ) {
cout << "Server Socket Creation Failed::Reason Code::" << WSAGetLastError() << endl;
return 0;
}
}
// connect
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(5600);
WSAConnect(g_ServerSocket, (SOCKADDR *)&service, sizeof(SOCKADDR), NULL, NULL, NULL, NULL);
{
int i = 0;
while (1)
{
if(i >= 50)
break;
char buffer[10];
//cin >> buffer ;
itoa(i, buffer, 10);
i++;
cout << buffer << endl;
if(strcmp(buffer, "exit") == 0)
break;
send(g_ServerSocket, buffer, sizeof(buffer), 1);
Sleep(500);
//recv(g_ServerSocket, buffer, sizeof(buffer), 1);
//cout << endl;
}
}
getchar();
closesocket(g_ServerSocket);
WSACleanup();
return 0;
}