无连接套接字时序: 服务器 客户机 socket() socket() bind() bind() readfrom() 阻塞等待客户 sendto() 处理服务 sendto() readfrom() close() close()
/* ******************************************************* 2004 12 7 stephen ******************************************************* */ #include <Winsock2.h> #pragma comment(lib,"wsock32.lib")
#define MAXSIZE 50
#define WM_RECEIVEDATA WM_USER+1002
class CNetServer { public: CNetServer(); CNetServer(int port); ~CNetServer(); inline void SetWnd(HWND hWnd) { this->m_hWnd = hWnd; } // bool InitNetServer();
static DWORD WINAPI ThreadServer(LPVOID n); bool SendMsg(char* data,int len,char* host,int port); char* getLastError(); private: WSADATA wsData; HWND m_hWnd; HANDLE m_hThread;
SOCKET listenSocket; sockaddr_in servAddr; sockaddr_in clientAddr; int port;
char szError[1024]; char szBuff[1024]; };
CNetServer::CNetServer() { m_hWnd = NULL; listenSocket = INVALID_SOCKET; if(WSAStartup(MAKEWORD(1,1),&wsData) !=0) { wsprintf(this->szError,TEXT("WSAStartup failed.Error:%d"),WSAGetLastError()); } port = 9999; memset(szBuff,0,sizeof(szBuff)); } CNetServer::CNetServer(int port) { m_hWnd = NULL; listenSocket = INVALID_SOCKET; if(WSAStartup(MAKEWORD(1,1),&wsData) !=0) { wsprintf(this->szError,TEXT("WSAStartup failed.Error:%d"),WSAGetLastError()); } this->port = port; } CNetServer::~CNetServer() { if(listenSocket != INVALID_SOCKET) closesocket(listenSocket); WSACleanup(); } char* CNetServer::getLastError() { return this->szError; } bool CNetServer::InitNetServer() { listenSocket = socket(AF_INET,SOCK_DGRAM,0); if(listenSocket == INVALID_SOCKET) { wsprintf(this->szError,TEXT("SOCKET failed.Error:%d"),WSAGetLastError()); return false; } servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(port); if(bind(listenSocket,(struct sockaddr*)&servAddr,sizeof(servAddr)) !=0) { wsprintf(this->szError,TEXT("bind failed.error:%d"),WSAGetLastError()); return false; } m_hThread = CreateThread(NULL,0,CNetServer::ThreadServer,(LPVOID)this,0,NULL); return true; } DWORD WINAPI CNetServer::ThreadServer(LPVOID n) { CNetServer* pServer = (CNetServer*)n; int len = sizeof(pServer->clientAddr); int rcv = 1; char buff[1024]; memset(buff,0,sizeof(buff)); while(rcv) { rcv = recvfrom(pServer->listenSocket, buff, sizeof(buff)-1, 0, (struct sockaddr*)&pServer->clientAddr, (int*)&len); if(rcv == SOCKET_ERROR) { wsprintf(pServer->szError,TEXT("recvfrom failed.Error:%d"),WSAGetLastError()); return -1; } if(rcv>0) { wsprintf(pServer->szBuff,TEXT("host:%s,port:%i,msg:%s"),inet_ntoa(pServer->clientAddr.sin_addr), ntohs(pServer->clientAddr.sin_port),buff); //::SendMessage(pServer->m_hWnd,WM_RECEIVEDATA,0,(LPARAM)pServer->Buff); MessageBox(NULL,pServer->szBuff,"getdata",0); }
} return 0L; } bool CNetServer::SendMsg(char* data,int len,char* host,int port) { int sent; hostent *hostData; if(atoi(host)) { long ip = inet_addr(host); hostData = gethostbyaddr((char*)&ip,sizeof(ip),AF_INET); } else { hostData = gethostbyname(host); } if(!hostData) { wsprintf(this->szError,TEXT("Host can not be NULL")); return false; } sockaddr_in dest; dest.sin_family = AF_INET; dest.sin_addr = *(in_addr*)(hostData->h_addr_list[0]); dest.sin_port = htons(port);
sent = sendto(this->listenSocket,data,len,0,(sockaddr*)&dest,sizeof(dest)); if(sent !=len) { wsprintf(this->szError,TEXT("sendto msg failed.Error:%d"),WSAGetLastError()); return false; } return true; } /* ************************************************************************ test ************************************************************************ */ int _tmain(int argc, _TCHAR* argv[]) { CNetServer net; if(net.InitNetServer() == false) cout<<net.getLastError()<<endl; char send[1024]; char host[32]; while(1) { cin>>send; if(stricmp(send,"exit") ==0) break; cin>>host; net.SendMsg(send,strlen(send),host,9999); }
} 
|