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.项目实践:尝试实现一个小项目,如聊天室,文件传输,以巩固所学知识

相关推荐
茶杯梦轩1 天前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
YuMiao3 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Sinclair6 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Rockbean7 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩7 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
海天鹰8 天前
【免费】PHP主机=域名+解析+主机
服务器
DianSan_ERP8 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
西岸行者8 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
呉師傅8 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒8 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器