封装的Socket通信类库
"该代码片段展示了封装的Socket类在Windows环境下的实现,使用了winsock2库,并且涉及到了DNS解析、TCP与UDP套接字的初始化等网络编程概念。" 在C++编程中,封装Socket类是将底层的网络通信接口包装成易于使用的对象,便于管理和操作。在给定的代码中,我们看到一些关键的定义和函数,这有助于理解Socket编程的基本元素: 1. **头文件引用**:`#include <winsock2.h>` 是Windows平台下进行Socket编程的标准头文件,包含了所有必要的函数原型和数据结构。`#pragma comment(lib, "ws2_32.lib")` 指令告诉编译器链接ws2_32.lib库,这是Winsock2所需的库文件。 2. **命名空间和映射**:使用`std`命名空间,同时定义了一个`map<string, string>`类型的变量`DNS`,可能用于存储域名和对应的IP地址。 3. **常量定义**:`MAX_QUEUE`(最大队列长度)、`MAX_SIZE`(最大消息大小)、`SERVER_gListenSocket`(服务器监听套接字的初始值)都是网络编程中常见的参数设置。 4. **全局变量**:`gListenSocket`、`servicegListenSocket`、`g_User` 和 `g_Password` 是全局变量,它们可能分别用于存储服务器监听套接字、服务状态的监听套接字、用户凭证信息。 5. **枚举类型CMDTYPE**:定义了三种命令类型:`CONNECT`(连接)、`BIND`(绑定)和`UDP`(用户数据报协议),这些通常对应Socket操作的不同阶段。 6. **结构体ServiceStruct**:包含TCP和UDP套接字的句柄,以及客户端的地址信息,可能用于处理并发连接和服务。 7. **函数定义**: - `GetName(const char* name)`:通过给定的域名使用`gethostbyname()`函数获取IP地址。 - `GetHostIP(char* buf)`:获取本机的IP地址并将其存储在缓冲区中。 - `InitUDPSocket(ServiceStruct& svc)`:看起来这个函数用于初始化UDP套接字,但代码片段在这里突然结束,没有展示完整的实现。 8. **网络编程基础**: - `gethostbyname()`:从主机名获取主机信息,包括IP地址。 - `sockaddr_in` 和 `in_addr`:分别是IPv4地址和套接字地址结构,用于存储网络地址信息。 - `int tcpsock` 和 `int udpsock`:可能是TCP和UDP套接字的文件描述符。 为了完全理解这个封装的Socket类,我们需要更多的上下文,如完整的`InitUDPSocket`函数以及其他可能存在的网络处理函数。但以上信息足以展示一个基本的Socket编程框架,包括套接字的创建、连接、绑定、监听和接收/发送数据等步骤。在实际应用中,这样的封装可以提高代码的可读性和可维护性。
#include <iostream>
#include <map>
#include <string>
#pragma comment(lib, "ws2_32.lib")
using namespace std;
map<string,string> DNS;
#define MAX_QUEUE 10
#define MAX_SIZE 80
#define SERVER_gListenSocket 1130
volatile int servicegListenSocket = 2000;
int gListenSocket=1130;
char *g_User, *g_Password;
enum CMDTYPE
{
CONNECT,BIND,UDP
};
struct ServiceStruct
{
int tcpsock;
int udpsock;
sockaddr_in clientadd;
in_addr clientip;
unsigned short clientgListenSocket;
unsigned short servicegListenSocket;//收发都用这个~
CMDTYPE cmdtype;
int svctcp_server;
};
in_addr GetName(const char* name)
{
hostent* he = gethostbyname(name);
return *((in_addr*)he->h_addr);
}
void GetHostIP(char* buf)
{
int ret;
char name[100];
ret = gethostname(name,1024);
if (ret != 0)
{
cout<<"gethostname() Error!"<<endl;
return;
}
in_addr hostadd = GetName(name);
buf[0] = hostadd.S_un.S_un_b.s_b1;
buf[1] = hostadd.S_un.S_un_b.s_b2;
buf[2] = hostadd.S_un.S_un_b.s_b3;
buf[3] = hostadd.S_un.S_un_b.s_b4;
}
bool InitUDPSocket(ServiceStruct& svc)
{
sockaddr_in serveradd;
svc.udpsock = socket(AF_INET,SOCK_DGRAM,0);
if (svc.udpsock == INVALID_SOCKET)
剩余16页未读,继续阅读
- 粉丝: 407
- 资源: 3
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Flex垃圾回收与内存管理:防止内存泄露
- Python编程规范与最佳实践
- EJB3入门:实战教程与核心概念详解
- Python指南v2.6简体中文版——入门教程
- ANSYS单元类型详解:从Link1到Link11
- 深度解析C语言特性与实践应用
- Gentoo Linux安装与使用全面指南
- 牛津词典txt版:信息技术领域的便捷电子书
- VC++基础教程:从入门到精通
- CTO与程序员职业规划:能力提升与路径指南
- Google开放手机联盟与Android开发教程
- 探索Android触屏界面开发:从入门到设计原则
- Ajax实战:从理论到实践
- 探索Android应用开发:从入门到精通
- LM317T稳压管详解:1.5A可调输出,过载保护
- C语言实现SOCKET文件传输简单教程