Socket学习

1.Socket编程基本概念

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

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

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

2.代码中的主要步骤

1.初始化Socket库

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

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

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.监听连接

if (listen(slisten, 5) == SOCKER_ERROR) {
    throw std::runtime_error("Socket listen error");
}

解释:

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

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

理解:

开始监听传入的连接请求

5.接收连接

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.接收和发送数据

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值