端口号快速复用函数
通过getsockopt和setsockopt函数,管理套接字的端口号复用设置。具体操作如下:
getsockopt函数
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
功能:获取套接字的某些选项的属性。
参数:
返回值: 成功返回0,失败返回-1。
setsockopt函数
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
功能:设置套接字的某些选项的属性。
参数:
返回值: 成功返回0,失败返回-1。
示例代码:端口号快速复用
// 获取当前端口号是否能快速复用
int n;
int len = sizeof(n);
getsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, &len);
if (n == 0) {
printf(\”端口号快速复用未启动\\n\”);
} else {
printf(\”端口号快速复用已经启动\\n\”);
}
// 设置当前套接字端口号快速复用
n = 999;
setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n));
1. 循环服务器模型
描述
循环服务器模型是一次只处理一个客户端请求的传统方式,处理完一个客户端请求后,才会继续处理下一个客户端请求。由于其效率较低,每次只能执行单个任务,因此在高并发场景下表现不佳。
在循环服务器模型中,服务器端采用了一个循环来不断接收客户端请求。每当一个客户端连接成功后,服务器创建一个新的套接字用于通信,并处理客户端的请求。每处理完一个客户端请求后,服务器继续等待下一个客户端的连接。
主要步骤:
- 每次 accept() 成功后,创建一个新的套接字用于通信。
- 循环收发信息,直到客户端断开连接。
关闭监听套接字
循环服务器代码实现
代码示例
#include <myhead.h>
#define IP \”192.168.60.45\”
#define PORT 6666
#define BACKLOG 20
int main(int argc, const char *argv[]) {
// 1. 创建套接字
int oldfd = socket(AF_INET, SOCK_STREAM, 0); // IPV4, TCP协议
if (oldfd == -1) {
perror(\”socket\”);
return -1;
}
// 2. 获取端口号属性,查看是否启用端口号快速复用
int n;
int len = sizeof(n);
if (getsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, &len) == -1) {
perror(\”getsockopt\”);
return -1;
}
if (n) {
printf(\”端口号快速复用已经启动\\n\”);
} else {
printf(\”端口号快速复用未启动\\n\”);
}
// 设置端口号快速复用
n = 999;
if (setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1) {
perror(\”setsockopt\”);
return -1;
}
printf(\”端口号快速复用成功\\n\”);
// 3. 绑定IP和端口号
struct sockaddr_in server = {
.sin_family = AF_INET, // IPV4
.sin_port = htons(PORT), // 端口号转换为网络字节序
.sin_addr.s_addr = inet_addr(IP), // IP地址
};
if (bind(oldfd, (struct sockaddr *)&server, sizeof(server)) == -1) {
perror(\”
评论前必须登录!
注册