Socket学习

1.Socket编程基本概念

·Socket:Socket是网络通信的基本概念,用于描述IP地址和端口的组合,它是网络编程的基础

·服务端和客户端:服务器监听客户端的连接请求,客户端发起连接

·TCP/IP:TCP是传输控制协议,保证数据包的传输顺序和完整性;IP是互联网协议,用于定义地址

2.代码中的主要步骤

1.初始化Socket库

cpp 复制代码
WORD sockversion = WORDMAKE(2,2);
WSADATA wsadata;
if (WSAStartup(sockversion, &wsadata) != 0) {
    throw std::runtime_error("WSAStartup failed);
}

解释:

·WSAStartup:初始化Winsock库,WORDMAKE(2.2)表示使用Winsock2.2版本

·WSADATA:用于存储Winsock初始化的信息

理解:

这是在Windows上进行任何网络编程的必要步骤。Linux系统不需要这一步

2.创建Socket

cpp 复制代码
slisten = sock(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (slisten == INVALID_SOCKET) {
    throw std::runtime_error("Socket creation error");
}

解释:

·socket函数创建一个套接字

·AF_INET:地址族,表示IPv4

·SOCK_STREAM:套接字类型,表示TCP

·IPPROTO_TCP:协议类型,表示TCP协议

理解:

创建一个用于监听客户端连接的套接字

3.绑定Socket

cpp 复制代码
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if (bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) {
    throw std::runtime_error("Socket bind failed");
}

解释:

·sockaddr_in:结构体,包含地址信息

·sin_family:地址族

·sin_port:端口号,使用htons函数将主机字节序转换为网络字节序

·sin_addr:IP地址,INADDR_ANY表示接收任何IP地址

理解:

绑定套接字到指定的IP地址和端口,使服务器能够监听指定端口上的连接请求

4.监听连接

cpp 复制代码
if (listen(slisten, 5) == SOCKER_ERROR) {
    throw std::runtime_error("Socket listen error");
}

解释:

·listen函数使套接字进入监听状态

·5:监听队列的最大长度

理解:

开始监听传入的连接请求

5.接收连接

cpp 复制代码
SOCKET sClient;
sockaddr_in remoteAddr;
int nAddrlen = sizeof(remoteAddr);
sClient = accept(slisten, (SOCKADDR*)&remoteAddr, &nAddrlen);
if (sClient == INVALID_SOCKET) {
    std::cerr << "Accept error!\n");
    continue;
}

解释:

·accept函数接收传入的连接请求,并返回一个新的套接字用于与客户端通信

·sockaddr_in remoteAddr:存储客户端的地址信息

理解:

等待客户端连接请求,并创建一个新的套接字用于与客户端通信

6.接收和发送数据

cpp 复制代码
int ret = recv(sClient, revData, 255, 0);
if (ret > 0) {
    revData[ret] = 0x00;
    std::cout << "Received: " << revData << std::endl;
}

const char* sendData = "Hello World from Server";
send(sClient, sendData, strlen(sendData), 0);
std::cout << "Sent: " << sendData << std::endl;

closesocket(sClient);

解释:

·revc函数接收客户端发送的数据

·sClient:客户端套接字

·revData:存储接收数据的缓冲区

·255:缓冲区大小

·send函数发送数据到客户端

·closesocket函数关闭与客户端的连接

理解:

服务器接收客户端的数据,并回复一条信息,然后关闭连接

3.如何学习和实践Socket编程

1.阅读和理解:仔细阅读并理解每一行代码和背后的概念,可以参考官方文档和教程

2.动手实验:自己动手编写简单的Socket程序,实验不同的功能和配置

3.调试和改进:使用调试工具和日志记录和观察程序的行为,找到并修复错误

4.项目实践:尝试实现一个小项目,如聊天室,文件传输,以巩固所学知识

相关推荐
IDC02_FEIYA15 小时前
服务器带宽怎么计算最大并发?服务器带宽计算公式
运维·服务器
lifejump15 小时前
NAT应用实验
运维·服务器
Hy行者勇哥15 小时前
Linux 系统搭建桌面级云端办公 APP(从快捷方式到自定义应用)
linux·运维·服务器
在路上看风景15 小时前
7.4 KDC和CA
网络
python百炼成钢15 小时前
52.Linux PWM子系统
linux·运维·服务器·驱动开发
新诺韦尔API15 小时前
手机空号检测接口对接全流程指南
大数据·网络·智能手机·api
乾元16 小时前
AI + Jinja2/Ansible:从自然语义到可执行 Playbook 的完整流水线(工程级深度)
运维·网络·人工智能·网络协议·华为·自动化·ansible
飞行增长手记16 小时前
IP协议从跨境到物联网的场景化应用
服务器·前端·网络·安全
GDAL16 小时前
客户端与服务器SSL协议/加密套件不兼容:完整解决方案
服务器·ssl
万邦科技Lafite16 小时前
API接口地址解析地区码操作指南
网络·数据库·redis·缓存·开放api·电商开放平台