导航菜单

C++编程/网络编程
课程进度 96% · 第18/18章18/18章 · 标签 1/3
1

Socket API 基础

使用 Socket API 进行网络通信的基础知识。

cpp
1
#include <iostream>
2
#include <sys/socket.h>
3
#include <netinet/in.h>
4
#include <arpa/inet.h>
5
#include <unistd.h>
6
#include <string.h>
7
using namespace std;
8
 
9
// 基本的Socket服务器
10
int createServer(int port) {
11
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
12
if (serverSocket == -1) {
13
cerr << "创建socket失败" << endl;
14
return -1;
15
}
16
 
17
sockaddr_in serverAddr;
18
serverAddr.sin_family = AF_INET;
19
serverAddr.sin_port = htons(port);
20
serverAddr.sin_addr.s_addr = INADDR_ANY;
21
 
22
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
23
cerr << "绑定失败" << endl;
24
return -1;
25
}
26
 
27
if (listen(serverSocket, 5) < 0) {
28
cerr << "监听失败" << endl;
29
return -1;
30
}
31
 
32
cout << "服务器启动,监听端口 " << port << endl;
33
return serverSocket;
34
}
35
 
36
// 基本的Socket客户端
37
int createClient(const char* serverIP, int port) {
38
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
39
sockaddr_in serverAddr;
40
serverAddr.sin_family = AF_INET;
41
serverAddr.sin_port = htons(port);
42
inet_pton(AF_INET, serverIP, &serverAddr.sin_addr);
43
 
44
if (connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
45
cerr << "连接失败" << endl;
46
return -1;
47
}
48
cout << "已连接到服务器" << endl;
49
return clientSocket;
50
}

📖Socket 是网络通信的基本接口,支持 TCP 和 UDP 协议。服务器端和客户端角色不同,需要处理字节序转换

2

Socket 选项与工具

cpp
1
// 设置Socket选项
2
void setSocketOptions(int sock) {
3
// 地址复用
4
int opt = 1;
5
setsockopt(sock, SOL_SOCKET,
6
SO_REUSEADDR, &opt, sizeof(opt));
7
 
8
// 超时设置
9
struct timeval timeout;
10
timeout.tv_sec = 5;
11
timeout.tv_usec = 0;
12
setsockopt(sock, SOL_SOCKET,
13
SO_RCVTIMEO, &timeout, sizeof(timeout));
14
 
15
// 禁用Nagle算法(降低延迟)
16
int flag = 1;
17
setsockopt(sock, IPPROTO_TCP,
18
TCP_NODELAY, &flag, sizeof(flag));
19
}
20
 
21
// 字节序转换
22
// htons: host to network short
23
// htonl: host to network long
24
// ntohs: network to host short
25
// ntohl: network to host long