织梦CMS - 轻松建站从此开始!

罗索

p2p打洞的功能封装

jackyhwei 发布于 2011-08-08 09:34 点击:次 
把它们封装一下,正在研究这个东西(封装的优点乱七八糟,基本来把别人的代码拷贝过来,简单修改一下就贴上去。)
TAG:

把它们封装一下,正在研究这个东西(封装的优点乱七八糟,基本来把别人的代码拷贝过来,简单修改一下就贴上去。)

  1. #ifndef _MYSOCKET_H_
  2. #define _MYSOCKET_H_
  3.  
  4. #include <WinSock2.h>
  5. #include "Exception.h"
  6. class CMySocket 
  7. public
  8.     CMySocket(int type); 
  9.  
  10.     void Bind(); 
  11.     inlineint Sendto(char FAR* buf, int len, int flags
  12. struct sockaddr FAR* to, int FAR* tolen); 
  13.     inlineint Sendto(char FAR* buf, int len, int flags
  14. const IpAddress& ipAddress); 
  15.      
  16.     inlineint Recvfrom(char FAR* buf, int len, int flags
  17. struct sockaddr FAR* from, int FAR* fromlen); 
  18.     inlineint Recvfrom(char FAR* buf, int len, int flags
  19. const IpAddress& ipAddress); 
  20.      
  21. protected
  22.     SOCKET m_socket; 
  23. }; 
  24. class IpAddress 
  25. public
  26.     IpAddress() 
  27.     { 
  28.         memset(&address, 0, sizeof address); 
  29.         address.sin_family = AF_INET; 
  30.         address.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
  31.     } 
  32.      
  33.     IpAddress(constchar* ip, DWORD port) 
  34.     { 
  35.         ASSERT(ip != NULL); 
  36.         address.sin_family = AF_INET; 
  37.         address.sin_addr.S_un.S_addr = inet_addr(serverip); 
  38.         address.sin_port = htons(port); 
  39.     } 
  40.     void SetIp(constchar* ip) 
  41.     { 
  42.         address.sin_addr.S_un.S_addr = inet_addr(ip); 
  43.     } 
  44.  
  45.     void SetPort(DWORD port) 
  46.     { 
  47.         address.sin_port = htons(port); 
  48.     } 
  49.     void SetAddress(constchar* ip, DWORD port) 
  50.     { 
  51.         ASSERT(ip != NULL); 
  52.         address.sin_addr.S_un.S_addr = inet_addr(ip); 
  53.         address.sin_port = htons(port); 
  54.     } 
  55.      
  56.     const socketaddr_in* operator&() 
  57.     { 
  58.         return &address; 
  59.     } 
  60. //  const socketaddr
  61.     socketaddr_in& GetRawElem() { return address; } 
  62.      
  63. private
  64.     socketaddr_in address; 
  65. }; 
  66. #endif
  67.  
  68. #include "stdafx.h"
  69.  
  70. #include "MySocket.h"
  71. #include <WinSock2.h>
  72. #pragma comment(lib, "ws2_32.lib")
  73.  
  74. CMySocket::CMySocket(int type) 
  75.     WSADATA wsaData; 
  76.  
  77.     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) 
  78.     { 
  79.         printf("Windows sockets 2.2 startup"); 
  80.         throw Exception(""); 
  81.     } 
  82.     else
  83.     { 
  84.         printf("Using %s (Status: %s)\n"
  85.         wsaData.szDescription, wsaData.szSystemStatus); 
  86.         printf("with API versions %d.%d to %d.%d\n\n"
  87.         LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion), 
  88.         LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); 
  89.     } 
  90.  
  91.     m_socket = socket(AF_INET, type, 0); 
  92.     if (m_socket < 0) 
  93.     { 
  94.         printf("create socket error"); 
  95.         throw Exception(""); 
  96.     } 
  97.  
  98. void CMySocket::Bind() 
  99.     sockaddr_in sin; 
  100.     sin.sin_addr.S_un.S_addr = INADDR_ANY; 
  101.     sin.sin_family = AF_INET; 
  102.     sin.sin_port = 0; 
  103.      
  104.     if (bind(m_socket, (struct sockaddr*)&sin, sizeof(sin)) < 0) 
  105.         throw Exception("bind error"); 
  106. int CMySocket::Sendto(char FAR* buf, int len, int flags
  107. struct sockaddr FAR* to, int FAR* tolen) 
  108.     ASSERT((buf != NULL) && (to != NULL)); 
  109.      
  110.     return sendto(m_socket, buf, len, flags, to, tolen); 
  111.  
  112. int CMySocket::Sendto(char FAR* buf, int len, int flags
  113. const IpAddress& ipAddress) 
  114.     return sendto(m_socket, buf, len, flags, &ipAddress, sizeof(sockaddr_in)); 
  115. int CMySocket::Recvfrom(char FAR* buf, int len, int flags
  116. struct sockaddr FAR* from, int FAR* fromlen) 
  117.     ASSERT((buf != NULL) && (from != NULL)); 
  118.      
  119.     return recvfrom(m_socket, buf, len, flags, from, fromlen); 
  120.  
  121. int CMySocket::Recvfrom(char FAR* buf, int len, int flags
  122. const IpAddress& ipAddress) 
  123.     return recvfrom(m_socket, buf, len, flags, &ipAddress, sizeof(sockaddr_in)); 
  124. }
  125.  
  126.  
  127. #include "stdafx.h"
  128. #include "Message.h"
  129. #include "MySocket.h"
  130. #include "ServerSocket.h"
  131. #include <cassert>
  132.  
  133. #define SERVER_PORT 2280
  134.  
  135. class CServerSocket; 
  136. class ClientSocket : public CMySocket 
  137. public
  138.     stUserListNode* GetUser(constchar *username); 
  139.     void ConnectToServer(constchar *username, constchar *serverip); 
  140.     bool SendMessageTo(constchar *UserName, constchar *Message); 
  141.  
  142. private
  143.     UserList m_userList; 
  144.     CServerSocket* m_ServerSocket; 
  145. }; 
  146. stUserListNode* ClientSocket::GetUser(constchar *username) 
  147.     for(UserList::iterator UserIterator = m_userList.begin(); 
  148.             UserIterator != m_userList.end(); ++UserIterator) 
  149.     { 
  150.         if( strcmp( ((*UserIterator)->userName), username) == 0 ) 
  151.             return *UserIterator; 
  152.     } 
  153.  
  154.     throw Exception("not find this user"); 
  155. }
  156. (shuizhiyun)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201106/14567.html]
本文出处:CSDN博客 作者:shuizhiyun
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容