把它们封装一下,正在研究这个东西(封装的优点乱七八糟,基本来把别人的代码拷贝过来,简单修改一下就贴上去。)
- #ifndef _MYSOCKET_H_
- #define _MYSOCKET_H_
-
- #include <WinSock2.h>
- #include "Exception.h"
- class CMySocket
- {
- public
- CMySocket(int type);
-
- void Bind();
- inlineint Sendto(char FAR* buf, int len, int flags
- , struct sockaddr FAR* to, int FAR* tolen);
- inlineint Sendto(char FAR* buf, int len, int flags
- , const IpAddress& ipAddress);
-
- inlineint Recvfrom(char FAR* buf, int len, int flags
- , struct sockaddr FAR* from, int FAR* fromlen);
- inlineint Recvfrom(char FAR* buf, int len, int flags
- , const IpAddress& ipAddress);
-
- protected
- SOCKET m_socket;
- };
- class IpAddress
- {
- public
- IpAddress()
- {
- memset(&address, 0, sizeof address);
- address.sin_family = AF_INET;
- address.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- }
-
- IpAddress(constchar* ip, DWORD port)
- {
- ASSERT(ip != NULL);
- address.sin_family = AF_INET;
- address.sin_addr.S_un.S_addr = inet_addr(serverip);
- address.sin_port = htons(port);
- }
- void SetIp(constchar* ip)
- {
- address.sin_addr.S_un.S_addr = inet_addr(ip);
- }
-
- void SetPort(DWORD port)
- {
- address.sin_port = htons(port);
- }
- void SetAddress(constchar* ip, DWORD port)
- {
- ASSERT(ip != NULL);
- address.sin_addr.S_un.S_addr = inet_addr(ip);
- address.sin_port = htons(port);
- }
-
- const socketaddr_in* operator&()
- {
- return &address;
- }
- socketaddr_in& GetRawElem() { return address; }
-
- private
- socketaddr_in address;
- };
- #endif
-
- #include "stdafx.h"
-
- #include "MySocket.h"
- #include <WinSock2.h>
- #pragma comment(lib, "ws2_32.lib")
-
- CMySocket::CMySocket(int type)
- {
- WSADATA wsaData;
-
- if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
- {
- printf("Windows sockets 2.2 startup");
- throw Exception("");
- }
- else
- {
- printf("Using %s (Status: %s)\n",
- wsaData.szDescription, wsaData.szSystemStatus);
- printf("with API versions %d.%d to %d.%d\n\n",
- LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion),
- LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion));
- }
-
- m_socket = socket(AF_INET, type, 0);
- if (m_socket < 0)
- {
- printf("create socket error");
- throw Exception("");
- }
- }
-
- void CMySocket::Bind()
- {
- sockaddr_in sin;
- sin.sin_addr.S_un.S_addr = INADDR_ANY;
- sin.sin_family = AF_INET;
- sin.sin_port = 0;
-
- if (bind(m_socket, (struct sockaddr*)&sin, sizeof(sin)) < 0)
- throw Exception("bind error");
- }
- int CMySocket::Sendto(char FAR* buf, int len, int flags
- , struct sockaddr FAR* to, int FAR* tolen)
- {
- ASSERT((buf != NULL) && (to != NULL));
-
- return sendto(m_socket, buf, len, flags, to, tolen);
- }
-
- int CMySocket::Sendto(char FAR* buf, int len, int flags
- , const IpAddress& ipAddress)
- {
- return sendto(m_socket, buf, len, flags, &ipAddress, sizeof(sockaddr_in));
- }
- int CMySocket::Recvfrom(char FAR* buf, int len, int flags
- , struct sockaddr FAR* from, int FAR* fromlen)
- {
- ASSERT((buf != NULL) && (from != NULL));
-
- return recvfrom(m_socket, buf, len, flags, from, fromlen);
- }
-
- int CMySocket::Recvfrom(char FAR* buf, int len, int flags
- , const IpAddress& ipAddress)
- {
- return recvfrom(m_socket, buf, len, flags, &ipAddress, sizeof(sockaddr_in));
- }
-
-
- #include "stdafx.h"
- #include "Message.h"
- #include "MySocket.h"
- #include "ServerSocket.h"
- #include <cassert>
-
- #define SERVER_PORT 2280
-
- class CServerSocket;
- class ClientSocket : public CMySocket
- {
- public
- stUserListNode* GetUser(constchar *username);
- void ConnectToServer(constchar *username, constchar *serverip);
- bool SendMessageTo(constchar *UserName, constchar *Message);
-
- private
- UserList m_userList;
- CServerSocket* m_ServerSocket;
- };
- stUserListNode* ClientSocket::GetUser(constchar *username)
- {
- for(UserList::iterator UserIterator = m_userList.begin();
- UserIterator != m_userList.end(); ++UserIterator)
- {
- if( strcmp( ((*UserIterator)->userName), username) == 0 )
- return *UserIterator;
- }
-
- throw Exception("not find this user");
- }
-
(shuizhiyun)
|