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

相关推荐
小歆8847 分钟前
100%全国产化时钟服务器、全国产化校时服务器、全国产化授时服务器
运维·服务器
大丈夫立于天地间12 分钟前
ISIS基础知识
网络·网络协议·学习·智能路由器·信息与通信
hgdlip15 分钟前
IP属地与视频定位位置不一致:现象解析与影响探讨
服务器·网络·tcp/ip
doubt。20 分钟前
【BUUCTF】[RCTF2015]EasySQL1
网络·数据库·笔记·mysql·安全·web安全
0xfather39 分钟前
在Debian系统中安装Debian(Linux版PE装机)
linux·服务器·debian
Again_acme1 小时前
20250118面试鸭特训营第26天
服务器·面试·php
Chambor_mak1 小时前
stm32单片机个人学习笔记14(USART串口数据包)
stm32·单片机·学习
PaLu-LI2 小时前
ORB-SLAM2源码学习:Initializer.cc⑧: Initializer::CheckRT检验三角化结果
c++·人工智能·opencv·学习·ubuntu·计算机视觉
Jackson~Y2 小时前
Linux(LAMP)
linux·运维·服务器
yuanbenshidiaos2 小时前
【大数据】机器学习----------计算机学习理论
大数据·学习·机器学习