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;
}
 

原创粉丝点击