ts.cpp
上传用户:hy11688
上传日期:2007-01-08
资源大小:81k
文件大小:9k
源码类别:

棋牌游戏

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. #include <winsock.h>
  3. #include "string.h"
  4. #include "ts.h"
  5. struct strListen
  6. {
  7.    HWND hWnd;
  8.    WORD wPort;
  9.    BYTE bMaxListen;
  10.    UINT uMessage;
  11.    BOOL fDelAuto;
  12.    SOCKET *psockUse;
  13. };
  14. DWORD ListenThread(strListen* pstrListen);
  15. DWORD dwRet;
  16. CTCPSocket::CTCPSocket(void)
  17. {
  18.    m_sockUse[0]=m_sockUse[1]=-1;
  19.    m_hListenThread=NULL;
  20. }
  21. CTCPSocket::~CTCPSocket(void)
  22. {
  23.    Close();
  24. }
  25. void CTCPSocket::CancelListen(void)
  26. {
  27.    ASSERT(IsListenSide());
  28.    ASSERT(m_wFlag&WSA_NOTIFY||m_wFlag&THREAD_NOTIFY);
  29.    switch(m_wFlag&0X0111)
  30.    {
  31.   case(WSA_NOTIFY):
  32.   WSAAsyncSelect(m_sockUse[0],m_hWnd,0,0);
  33.   closesocket(m_sockUse[0]);
  34.   m_sockUse[0]=-1;
  35.   break;
  36.   case(THREAD_NOTIFY):
  37.   if(m_hListenThread)
  38.   {
  39.  TerminateThread(m_hListenThread,0);
  40.  m_hListenThread=NULL;
  41.   }
  42.   break;
  43.   default:
  44.   break;
  45.    }
  46.    Close();
  47. }
  48. void CTCPSocket::Close(void)
  49. {
  50.    if(m_sockUse[1]>0)
  51.  closesocket(m_sockUse[1]);
  52.    if(m_sockUse[0]>0)
  53.  closesocket(m_sockUse[0]);
  54.    m_sockUse[0]=m_sockUse[1]=-1;
  55. }
  56. void CTCPSocket::InitData(HWND hWndOwner,
  57.                           WORD wPort,
  58.                           BOOL fListen,
  59.                           WORD wFlag,
  60.                           BYTE bMax,
  61.                           UINT uAccept)
  62. {
  63.    Close();
  64.    m_hWnd=hWndOwner;
  65.    m_uAccept=uAccept;
  66.    m_wFlag=wFlag;
  67.    m_wPort=wPort;
  68.    m_bMaxListen=bMax;
  69.    m_wFlag |=( fListen )?
  70.                  LISTEN_SIDE:CONNECT_SIDE;
  71. }
  72. void CTCPSocket::CloseListenSocket(void)
  73. {
  74. if(!IsListenSide())
  75. return;
  76.    if(m_sockUse[0]>0)
  77.  closesocket(m_sockUse[0]);
  78. m_sockUse[0]=SOCKET_ERROR;
  79. }
  80. BOOL CTCPSocket::Established(HWND hWndOwner,UINT uRead)
  81. {
  82.    ASSERT(hWndOwner);
  83.    m_uRead=uRead;
  84.    int iStatus=WSAAsyncSelect(GetCommSocket(),hWndOwner,
  85.                                   m_uRead,FD_READ|FD_CLOSE);
  86.    return !(iStatus>0);
  87. }
  88. BOOL CTCPSocket::Establish(LPCSTR lpszOtherHost)
  89. {
  90.    ASSERT(m_sockUse[0]==-1);
  91.    if(IsListenSide())
  92.       return ListenSide();
  93. else
  94.    {
  95.       ASSERT(lpszOtherHost);
  96.       return ConnectSide(lpszOtherHost);
  97.    }
  98. }
  99. BOOL CTCPSocket::ListenSide(void)
  100. {
  101.    WORD wFlag=m_wFlag;
  102.    wFlag&=0X0111;
  103.    switch(wFlag)
  104.    {
  105.   case(BLOCKING_NOTIFY):
  106.   return BSDListen();
  107.   break;
  108.   case(THREAD_NOTIFY):
  109.   return ThreadListen();
  110.   break;
  111.   case(WSA_NOTIFY):
  112.   return WSAListen();
  113.   break;
  114.   default:
  115.   ASSERT(0);
  116.   break;
  117.    }
  118.  return FALSE;
  119. }
  120. BOOL CTCPSocket::WSAAccept(void)
  121. {
  122.    SOCKADDR_IN sinClient;
  123.    int iLength;
  124.    ASSERT(m_sockUse[0]!=-1);
  125.    ASSERT(m_wFlag&WSA_NOTIFY);
  126.    iLength=sizeof(sinClient);
  127.    m_sockUse[1]=accept(m_sockUse[0],
  128.                     (struct sockaddr FAR *)&sinClient,
  129.                          (int FAR*)&iLength);
  130.    
  131.    if(SOCKET_ERROR==m_sockUse[1])
  132.    {
  133.       closesocket(m_sockUse[0]);
  134.   m_sockUse[0]=-1;
  135.       return FALSE;
  136.    }
  137.   else
  138.      return TRUE;
  139. }
  140. BOOL CTCPSocket::WSAListen(void)
  141. {
  142.    SOCKADDR_IN sinLocal;
  143.    PHOSTENT pHost;
  144.    char szHostName[60];
  145.    int iStatus;
  146.    
  147.    m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0);
  148.    if(m_sockUse[0]<0)
  149.       return FALSE;
  150.    
  151.    sinLocal.sin_family=AF_INET;
  152.    sinLocal.sin_port=htons(m_wPort);
  153.    
  154.    gethostname(szHostName,60);
  155.    pHost=gethostbyname(szHostName);
  156.    
  157.    if(pHost==NULL)
  158.       return FALSE;
  159.    
  160.    memcpy((LPSTR)&(sinLocal.sin_addr),
  161.              (LPSTR)pHost->h_addr,
  162.                  pHost->h_length);
  163.    
  164.    iStatus=bind(m_sockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal));
  165.    if(iStatus<0)
  166.    {
  167.       closesocket(m_sockUse[0]);
  168.   m_sockUse[0]=-1;
  169.       return FALSE;
  170.    }
  171.    
  172.    if(0>(iStatus=listen(m_sockUse[0],m_bMaxListen)))
  173.    {
  174.       closesocket(m_sockUse[0]);
  175.   m_sockUse[0]=-1;
  176.       return FALSE;
  177.    }
  178.    iStatus=WSAAsyncSelect(m_sockUse[0],m_hWnd,m_uAccept,FD_ACCEPT);
  179.    if(iStatus>0)
  180.    {
  181.       closesocket(m_sockUse[0]);
  182.   m_sockUse[0]=-1;
  183.       return FALSE;
  184.    }
  185.   else
  186.   return TRUE;
  187. }
  188. BOOL CTCPSocket::BSDListen(void)
  189. {
  190.    SOCKADDR_IN sinLocal,sinClient;
  191.    PHOSTENT pHost;
  192.    char szHostName[60];
  193.    int iStatus;
  194.    int iLength;
  195.    m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0);
  196.    if(m_sockUse[0]<0)
  197.       return FALSE;
  198.    
  199.    sinLocal.sin_family=AF_INET;
  200.    sinLocal.sin_port=htons(m_wPort);
  201.    
  202.    gethostname(szHostName,60);
  203.    pHost=gethostbyname(szHostName);
  204.    
  205.    if(pHost==NULL)
  206.       return FALSE;
  207.    
  208.    memcpy((LPSTR)&(sinLocal.sin_addr),
  209.              (LPSTR)pHost->h_addr,
  210.                  pHost->h_length);
  211.    
  212.    iStatus=bind(m_sockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal));
  213.    if(iStatus<0)
  214.    {
  215.       closesocket(m_sockUse[0]);
  216.   m_sockUse[0]=-1;
  217.       return FALSE;
  218.    }
  219.    
  220.    if(0>(iStatus=listen(m_sockUse[0],m_bMaxListen)))
  221.    {
  222.       closesocket(m_sockUse[0]);
  223.   m_sockUse[0]=-1;
  224.       return FALSE;
  225.    }
  226.    iLength=sizeof(sinClient);
  227.    m_sockUse[1]=accept(m_sockUse[0],
  228.                     (struct sockaddr FAR *)&sinClient,
  229.                          (int FAR*)&iLength);
  230.    
  231.    if(SOCKET_ERROR==m_sockUse[1])
  232.    {
  233.       closesocket(m_sockUse[0]);
  234.   m_sockUse[0]=-1;
  235.       return FALSE;
  236.    }
  237.   else
  238.      return TRUE;
  239. }
  240. BOOL CTCPSocket::ThreadListen(void)
  241. {
  242.    strListen* pstrListen=new (strListen);
  243.    pstrListen->hWnd=m_hWnd;
  244.    pstrListen->bMaxListen=m_bMaxListen;
  245.    pstrListen->uMessage=m_uAccept;
  246.    pstrListen->fDelAuto=TRUE;
  247.    pstrListen->wPort=m_wPort;
  248.    pstrListen->psockUse=m_sockUse;
  249.    m_hListenThread=CreateThread(NULL,
  250.                                 0,
  251.                                 (LPTHREAD_START_ROUTINE)ListenThread,
  252. pstrListen,
  253. 0,
  254. &dwRet);
  255.    return (m_hListenThread!=NULL);
  256. }
  257. BOOL CTCPSocket::ConnectSide(LPCSTR lpszServer)
  258. {
  259.    //SOCKET sockConnect;
  260.    SOCKADDR_IN sinServer;
  261.    PHOSTENT pHost;
  262.    int iStatus;
  263.    sinServer.sin_family=AF_INET;
  264.    pHost=gethostbyname(lpszServer);
  265.    if(pHost==NULL)
  266.       return FALSE;
  267.    sinServer.sin_port=htons(m_wPort);
  268.    
  269.    memcpy(&sinServer.sin_addr,pHost->h_addr,pHost->h_length);
  270.    m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0);
  271.    if(m_sockUse[0]<0)
  272.       return FALSE;
  273.    iStatus=connect(m_sockUse[0],(struct sockaddr*)&sinServer,sizeof(sinServer));
  274.    if(iStatus<0)
  275.    {
  276.       closesocket(m_sockUse[0]);
  277.   m_sockUse[0]=-1;
  278.       return FALSE;
  279.    }
  280. else
  281.    return TRUE;
  282. }
  283. int CTCPSocket::Read(LPSTR pRead,DWORD dwRead)
  284. {
  285.    DWORD dwR=0;
  286.    DWORD dwLeft=dwRead;
  287.    SOCKET sockRead=GetCommSocket();
  288.    while(dwLeft)
  289.    {
  290.   dwR=recv(sockRead,pRead+dwRead-dwLeft,dwLeft,0);
  291.   if(dwR==-1)
  292.   {
  293.      char szError[100];
  294.  sprintf(szError,"%X Read Error",WSAGetLastError());
  295.      //AfxMessageBox(szError,MB_OK);
  296.  return -1;
  297.   }
  298.       dwLeft-=dwR;
  299.    }
  300.    return (dwRead-dwLeft);
  301. }
  302. int CTCPSocket::Write(LPCSTR pWrite,DWORD dwWrite)
  303. {
  304.    DWORD dwW=0;
  305.    DWORD dwLeft=dwWrite;
  306.    SOCKET sockWrite=GetCommSocket();
  307.    while(dwLeft)
  308.    {
  309.   dwW=send(sockWrite,pWrite+dwWrite-dwLeft,dwLeft,0);
  310.   if(dwW==-1)
  311.      return -1;
  312.       dwLeft-=dwW;
  313.    }
  314.    return (dwWrite-dwLeft);
  315. }
  316. DWORD ListenThread(strListen *pstrListen)
  317. {
  318.    SOCKADDR_IN sinLocal,sinClient;
  319.    PHOSTENT pHost;
  320.    char szHostName[60];
  321.    int iStatus;
  322.    int iLength;
  323.    strListen strListen;
  324.    memcpy((void*)&strListen,(void*)pstrListen,sizeof(strListen));
  325.    if(pstrListen->fDelAuto)
  326.       delete pstrListen;
  327.    strListen.psockUse[0]=socket(AF_INET,SOCK_STREAM,0);
  328.    if(strListen.psockUse[0]<0)
  329.       {
  330.          SendMessage(strListen.hWnd,
  331.                      strListen.uMessage,
  332.  0,
  333.                      WSAMAKESELECTREPLY(FD_ACCEPT,1));
  334.          return 0;
  335.   }
  336.    
  337.    sinLocal.sin_family=AF_INET;
  338.    sinLocal.sin_port=htons(strListen.wPort);
  339.    
  340.    gethostname(szHostName,60);
  341.    pHost=gethostbyname(szHostName);
  342.    
  343.    if(pHost==NULL)
  344.       return FALSE;
  345.    
  346.    memcpy((LPSTR)&(sinLocal.sin_addr),
  347.              (LPSTR)pHost->h_addr,
  348.                  pHost->h_length);
  349.    
  350.    iStatus=bind(strListen.psockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal));
  351.    if(iStatus<0)
  352.    {
  353.       closesocket(strListen.psockUse[0]);
  354.   strListen.psockUse[0]=-1;
  355.       SendMessage(strListen.hWnd,
  356.                   strListen.uMessage,
  357.   0,
  358.                   WSAMAKESELECTREPLY(FD_ACCEPT,1));
  359.   return 0;
  360.    }
  361.    
  362.    if(0>(iStatus=listen(strListen.psockUse[0],strListen.bMaxListen)))
  363.    {
  364.       closesocket(strListen.psockUse[0]);
  365.   strListen.psockUse[0]=-1;
  366.   SendMessage(strListen.hWnd,
  367.                   strListen.uMessage,
  368.   0,
  369.                   WSAMAKESELECTREPLY(FD_ACCEPT,1));
  370.   return 0;
  371.    }
  372.    iLength=sizeof(sinClient);
  373.    strListen.psockUse[1]=accept(strListen.psockUse[0],
  374.                     (struct sockaddr FAR *)&sinClient,
  375.                          (int FAR*)&iLength);
  376.    
  377.    if(SOCKET_ERROR==strListen.psockUse[1])
  378.    {
  379.       closesocket(strListen.psockUse[0]);
  380.   strListen.psockUse[0]=-1;
  381.       SendMessage(strListen.hWnd,
  382.                   strListen.uMessage,
  383.   0,
  384.                   WSAMAKESELECTREPLY(FD_ACCEPT,1));
  385.       return 0;
  386.    }
  387.   else
  388.   {
  389.      SendMessage(strListen.hWnd,
  390.                      strListen.uMessage,
  391.  0,
  392.                      WSAMAKESELECTREPLY(FD_ACCEPT,0));
  393.          return TRUE;
  394.   }
  395. }