winsock 完成端口 简单服务器模型
来源:互联网 发布:php imsi获取手机号码 编辑:程序博客网 时间:2024/05/16 00:29
#include "stdafx.h"
#include < Winsock2.h>
#include <malloc.h>
#pragma comment(lib,"Ws2_32.lib")
#define BUFFER_SIZE 1024
void InitSock()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
return;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
WSACleanup( );
return;
}
}
typedef struct _BUFFER_OBJ
{
OVERLAPPED ol;
char buf[BUFFER_SIZE];
int nOperatorType;
#define OP_READ 1;
}BUFFER_OBJ,*PBUFFER_OBJ;
typedef struct
{
SOCKET s;
}SOCKET_OBJ,*PSOCKET_OBJ;
DWORD WINAPI ThreadProc(
LPVOID lpParameter
)
{
HANDLE hCompletion = (HANDLE)lpParameter;
PSOCKET_OBJ pSocket;
PBUFFER_OBJ pBuffer;
DWORD dwTrans;
while(true)
{
BOOL ok=::GetQueuedCompletionStatus(hCompletion,&dwTrans,(DWORD *)&pSocket,(LPOVERLAPPED*)&pBuffer,INFINITE);
if(!ok)
{
::closesocket(pSocket->s);
::GlobalFree(pSocket);
::GlobalFree(pBuffer);
}
else
{
if(dwTrans==0)
{
printf("close/n");
::closesocket(pSocket->s);
::GlobalFree(pSocket);
::GlobalFree(pBuffer);
}
else
{
pBuffer->buf[dwTrans]='/0';
printf("%s/n",pBuffer->buf);
WSABUF buf;
buf.buf=pBuffer->buf;
buf.len=BUFFER_SIZE;
DWORD dwBytes;
DWORD dwFlags=0;
if(SOCKET_ERROR==WSARecv(pSocket->s,&buf,1,&dwBytes,&dwFlags,&pBuffer->ol,NULL))
{
if(WSA_IO_PENDING==::WSAGetLastError())
{
printf("succ/n");
}
}
}
}
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
InitSock();
HANDLE hCompletion=CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,0,0);
HANDLE hThread=::CreateThread(NULL,0,ThreadProc,hCompletion,0,NULL);
CloseHandle(hThread);
SOCKET sListen=socket(AF_INET,SOCK_STREAM,0);
sockaddr_in addr;
addr.sin_addr.S_un.S_addr=INADDR_ANY;
addr.sin_family=AF_INET;
addr.sin_port=htons(4567);
bind(sListen,(sockaddr*)&addr,sizeof(addr));
listen(sListen,5);
while(true)
{
sockaddr_in remote;
int len=sizeof(sockaddr_in);
SOCKET client=accept(sListen,(sockaddr*)&remote,&len);
if(INVALID_SOCKET == client)
{
printf("error/n");
}
PSOCKET_OBJ pSocket=(PSOCKET_OBJ)GlobalAlloc(GPTR,sizeof(SOCKET_OBJ));
pSocket->s=client;
::CreateIoCompletionPort((HANDLE)client,hCompletion,(DWORD)pSocket,0);
PBUFFER_OBJ pBuffer=(PBUFFER_OBJ)::GlobalAlloc(GPTR,sizeof(BUFFER_OBJ));
pBuffer->nOperatorType=OP_READ;
//pBuffer->ol.hEvent=::WSACreateEvent();
WSABUF buf;
buf.buf=pBuffer->buf;
buf.len=BUFFER_SIZE;
DWORD dwBytes;
DWORD dwFlags=0;
if(SOCKET_ERROR==WSARecv(client,&buf,1,&dwBytes,&dwFlags,&pBuffer->ol,NULL))
{
if(WSA_IO_PENDING==::WSAGetLastError())
{
printf("succ/n");
}
}
}
return 0;
}
- winsock 完成端口 简单服务器模型
- winsock 完成端口 服务器模型(1)
- winsock 完成端口 服务器模型(2)
- winsock 完成端口 服务器模型(3)
- Winsock完成端口模型
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- Winsock 完成端口模型简介
- 这两天中国互联网谣言四起啊?不是这个逝世了就是那个去世了
- 存储过程动态条件查询
- 测试模型 - V-Model概述
- Tomcat
- ASP.net 上传整个文件夹
- winsock 完成端口 简单服务器模型
- Oracle中update的用法
- DataGrid 中双向排序的一种办法
- Joel Spolsky在耶鲁的演讲无责任导读 By 刘未鹏(pongba)
- 对冲基金
- 30岁经理人为何职涯蹉跎
- vc 小练
- 金山毒霸2008杀毒更快更准更彻底!
- HTML七种加密解密