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