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

相关推荐
CCCC13101632 小时前
嵌入式学习(day 28)线程
jvm·学习
玩转以太网3 小时前
基于W55MH32Q-EVB 实现 HTTP 服务器配置 OLED 滚动显示信息
服务器·网络协议·http
星星火柴9363 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
小狗爱吃黄桃罐头3 小时前
正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
linux·驱动开发·学习
秃了也弱了。3 小时前
WireShark:非常好用的网络抓包工具
网络·测试工具·wireshark
小晶晶京京4 小时前
day34-LNMP详解
linux·运维·服务器
画个太阳作晴天4 小时前
A12预装app
linux·服务器·前端
艾莉丝努力练剑4 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
清源妙木真菌4 小时前
应用层协议——HTTP
网络·网络协议·http
碎像5 小时前
Linux上配置环境变量
linux·运维·服务器