www.pudn.com > 64024076.rar > ts.cpp
#include "stdafx.h" #include#include "string.h" #include "ts.h" struct strListen { HWND hWnd; WORD wPort; BYTE bMaxListen; UINT uMessage; BOOL fDelAuto; SOCKET *psockUse; }; DWORD ListenThread(strListen* pstrListen); DWORD dwRet; CTCPSocket::CTCPSocket(void) { m_sockUse[0]=m_sockUse[1]=-1; m_hListenThread=NULL; } CTCPSocket::~CTCPSocket(void) { Close(); } void CTCPSocket::CancelListen(void) { ASSERT(IsListenSide()); ASSERT(m_wFlag&WSA_NOTIFY||m_wFlag&THREAD_NOTIFY); switch(m_wFlag&0X0111) { case(WSA_NOTIFY): WSAAsyncSelect(m_sockUse[0],m_hWnd,0,0); closesocket(m_sockUse[0]); m_sockUse[0]=-1; break; case(THREAD_NOTIFY): if(m_hListenThread) { TerminateThread(m_hListenThread,0); m_hListenThread=NULL; } break; default: break; } Close(); } void CTCPSocket::Close(void) { if(m_sockUse[1]>0) closesocket(m_sockUse[1]); if(m_sockUse[0]>0) closesocket(m_sockUse[0]); m_sockUse[0]=m_sockUse[1]=-1; } void CTCPSocket::InitData(HWND hWndOwner, WORD wPort, BOOL fListen, WORD wFlag, BYTE bMax, UINT uAccept) { Close(); m_hWnd=hWndOwner; m_uAccept=uAccept; m_wFlag=wFlag; m_wPort=wPort; m_bMaxListen=bMax; m_wFlag |=( fListen )? LISTEN_SIDE:CONNECT_SIDE; } void CTCPSocket::CloseListenSocket(void) { if(!IsListenSide()) return; if(m_sockUse[0]>0) closesocket(m_sockUse[0]); m_sockUse[0]=SOCKET_ERROR; } BOOL CTCPSocket::Established(HWND hWndOwner,UINT uRead) { ASSERT(hWndOwner); m_uRead=uRead; int iStatus=WSAAsyncSelect(GetCommSocket(),hWndOwner, m_uRead,FD_READ|FD_CLOSE); return !(iStatus>0); } BOOL CTCPSocket::Establish(LPCSTR lpszOtherHost) { ASSERT(m_sockUse[0]==-1); if(IsListenSide()) return ListenSide(); else { ASSERT(lpszOtherHost); return ConnectSide(lpszOtherHost); } } BOOL CTCPSocket::ListenSide(void) { WORD wFlag=m_wFlag; wFlag&=0X0111; switch(wFlag) { case(BLOCKING_NOTIFY): return BSDListen(); break; case(THREAD_NOTIFY): return ThreadListen(); break; case(WSA_NOTIFY): return WSAListen(); break; default: ASSERT(0); break; } return FALSE; } BOOL CTCPSocket::WSAAccept(void) { SOCKADDR_IN sinClient; int iLength; ASSERT(m_sockUse[0]!=-1); ASSERT(m_wFlag&WSA_NOTIFY); iLength=sizeof(sinClient); m_sockUse[1]=accept(m_sockUse[0], (struct sockaddr FAR *)&sinClient, (int FAR*)&iLength); if(SOCKET_ERROR==m_sockUse[1]) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } else return TRUE; } BOOL CTCPSocket::WSAListen(void) { SOCKADDR_IN sinLocal; PHOSTENT pHost; char szHostName[60]; int iStatus; m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0); if(m_sockUse[0]<0) return FALSE; sinLocal.sin_family=AF_INET; sinLocal.sin_port=htons(m_wPort); gethostname(szHostName,60); pHost=gethostbyname(szHostName); if(pHost==NULL) return FALSE; memcpy((LPSTR)&(sinLocal.sin_addr), (LPSTR)pHost->h_addr, pHost->h_length); iStatus=bind(m_sockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal)); if(iStatus<0) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } if(0>(iStatus=listen(m_sockUse[0],m_bMaxListen))) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } iStatus=WSAAsyncSelect(m_sockUse[0],m_hWnd,m_uAccept,FD_ACCEPT); if(iStatus>0) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } else return TRUE; } BOOL CTCPSocket::BSDListen(void) { SOCKADDR_IN sinLocal,sinClient; PHOSTENT pHost; char szHostName[60]; int iStatus; int iLength; m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0); if(m_sockUse[0]<0) return FALSE; sinLocal.sin_family=AF_INET; sinLocal.sin_port=htons(m_wPort); gethostname(szHostName,60); pHost=gethostbyname(szHostName); if(pHost==NULL) return FALSE; memcpy((LPSTR)&(sinLocal.sin_addr), (LPSTR)pHost->h_addr, pHost->h_length); iStatus=bind(m_sockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal)); if(iStatus<0) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } if(0>(iStatus=listen(m_sockUse[0],m_bMaxListen))) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } iLength=sizeof(sinClient); m_sockUse[1]=accept(m_sockUse[0], (struct sockaddr FAR *)&sinClient, (int FAR*)&iLength); if(SOCKET_ERROR==m_sockUse[1]) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } else return TRUE; } BOOL CTCPSocket::ThreadListen(void) { strListen* pstrListen=new (strListen); pstrListen->hWnd=m_hWnd; pstrListen->bMaxListen=m_bMaxListen; pstrListen->uMessage=m_uAccept; pstrListen->fDelAuto=TRUE; pstrListen->wPort=m_wPort; pstrListen->psockUse=m_sockUse; m_hListenThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListenThread, pstrListen, 0, &dwRet); return (m_hListenThread!=NULL); } BOOL CTCPSocket::ConnectSide(LPCSTR lpszServer) { //SOCKET sockConnect; SOCKADDR_IN sinServer; PHOSTENT pHost; int iStatus; sinServer.sin_family=AF_INET; pHost=gethostbyname(lpszServer); if(pHost==NULL) return FALSE; sinServer.sin_port=htons(m_wPort); memcpy(&sinServer.sin_addr,pHost->h_addr,pHost->h_length); m_sockUse[0]=socket(AF_INET,SOCK_STREAM,0); if(m_sockUse[0]<0) return FALSE; iStatus=connect(m_sockUse[0],(struct sockaddr*)&sinServer,sizeof(sinServer)); if(iStatus<0) { closesocket(m_sockUse[0]); m_sockUse[0]=-1; return FALSE; } else return TRUE; } int CTCPSocket::Read(LPSTR pRead,DWORD dwRead) { DWORD dwR=0; DWORD dwLeft=dwRead; SOCKET sockRead=GetCommSocket(); while(dwLeft) { dwR=recv(sockRead,pRead+dwRead-dwLeft,dwLeft,0); if(dwR==-1) { char szError[100]; sprintf(szError,"%X Read Error",WSAGetLastError()); //AfxMessageBox(szError,MB_OK); return -1; } dwLeft-=dwR; } return (dwRead-dwLeft); } int CTCPSocket::Write(LPCSTR pWrite,DWORD dwWrite) { DWORD dwW=0; DWORD dwLeft=dwWrite; SOCKET sockWrite=GetCommSocket(); while(dwLeft) { dwW=send(sockWrite,pWrite+dwWrite-dwLeft,dwLeft,0); if(dwW==-1) return -1; dwLeft-=dwW; } return (dwWrite-dwLeft); } DWORD ListenThread(strListen *pstrListen) { SOCKADDR_IN sinLocal,sinClient; PHOSTENT pHost; char szHostName[60]; int iStatus; int iLength; strListen strListen; memcpy((void*)&strListen,(void*)pstrListen,sizeof(strListen)); if(pstrListen->fDelAuto) delete pstrListen; strListen.psockUse[0]=socket(AF_INET,SOCK_STREAM,0); if(strListen.psockUse[0]<0) { SendMessage(strListen.hWnd, strListen.uMessage, 0, WSAMAKESELECTREPLY(FD_ACCEPT,1)); return 0; } sinLocal.sin_family=AF_INET; sinLocal.sin_port=htons(strListen.wPort); gethostname(szHostName,60); pHost=gethostbyname(szHostName); if(pHost==NULL) return FALSE; memcpy((LPSTR)&(sinLocal.sin_addr), (LPSTR)pHost->h_addr, pHost->h_length); iStatus=bind(strListen.psockUse[0],(struct sockaddr FAR*)&sinLocal,sizeof(sinLocal)); if(iStatus<0) { closesocket(strListen.psockUse[0]); strListen.psockUse[0]=-1; SendMessage(strListen.hWnd, strListen.uMessage, 0, WSAMAKESELECTREPLY(FD_ACCEPT,1)); return 0; } if(0>(iStatus=listen(strListen.psockUse[0],strListen.bMaxListen))) { closesocket(strListen.psockUse[0]); strListen.psockUse[0]=-1; SendMessage(strListen.hWnd, strListen.uMessage, 0, WSAMAKESELECTREPLY(FD_ACCEPT,1)); return 0; } iLength=sizeof(sinClient); strListen.psockUse[1]=accept(strListen.psockUse[0], (struct sockaddr FAR *)&sinClient, (int FAR*)&iLength); if(SOCKET_ERROR==strListen.psockUse[1]) { closesocket(strListen.psockUse[0]); strListen.psockUse[0]=-1; SendMessage(strListen.hWnd, strListen.uMessage, 0, WSAMAKESELECTREPLY(FD_ACCEPT,1)); return 0; } else { SendMessage(strListen.hWnd, strListen.uMessage, 0, WSAMAKESELECTREPLY(FD_ACCEPT,0)); return TRUE; } }