socket server 使用

本文介绍如何创建一个请求处理类,并通过实例化TCP服务器来处理单个请求。文章详细描述了服务器IP的设置、请求处理类的传递以及服务器的关闭过程。

创建一个请求处理类

实例化TCP server,并且传递server ip 和你上面创建的请求处理类 给 这个TCP server
server.handle_request()   只处理一个请求

server.close()

 

转载于:https://www.cnblogs.com/Cohen/p/8728226.html

### Linux环境下socket server使用 在 Linux 环境下创建一个简单的 socket server 通常包含以下步骤: 1. **创建套接字**:使用 `socket()` 函数创建一个套接字对象。 2. **绑定地址和端口**:使用 `bind()` 函数将套接字绑定到指定的 IP 地址和端口。 3. **监听连接**:使用 `listen()` 函数开始监听客户端的连接请求。 4. **接受连接**:使用 `accept()` 函数接受客户端的连接。 5. **数据通信**:使用 `send()` 和 `recv()` 函数进行数据的发送和接收。 6. **关闭连接**:使用 `close()` 函数关闭套接字。 以下是一个简单的 Python 示例: ```python import socket # 创建一个 TCP/IP 套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口 server_address = ('localhost', 8080) server_socket.bind(server_address) # 开始监听连接 server_socket.listen(1) print('Waiting for a connection...') connection, client_address = server_socket.accept() try: print(f'Connection from {client_address}') # 接收数据 data = connection.recv(1024) print(f'Received: {data.decode()}') # 发送响应 message = 'Hello, client!' connection.sendall(message.encode()) finally: # 关闭连接 connection.close() ``` ### 解决socket bind端口绑定失败问题 socket bind 端口绑定失败可能由多种原因导致,以下是一些常见的原因及解决方法: 1. **端口号被占用**:可以使用 `netstat -tuln | grep <port>` 或 `lsof -i :<port>` 命令来检查端口是否被占用。如果端口被占用,可以停止占用该端口的进程,或者更改要绑定的端口号[^3]。 2. **端口处于 TIME_WAIT 状态**:在未设置 `SO_REUSEADDR` 的情况下,如果程序被终止,套接字所使用的端口可能会进入 TIME_WAIT 状态。如果立即重新启动程序并尝试重新绑定到相同的端口,`bind` 调用可能会失败。可以设置 `SO_REUSEADDR` 选项来允许在 TIME_WAIT 状态下重新使用端口。以下是一个 C 语言示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 8080 int main() { int server_fd, new_socket; struct sockaddr_in address; int opt = 1; int addrlen = sizeof(address); char buffer[1024] = {0}; const char *hello = "Hello from server"; // 创建套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置 SO_REUSEADDR 选项 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { perror("setsockopt"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定地址和端口 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听连接 if (listen(server_fd, 3) < 0) { perror("listen"); exit(EXIT_FAILURE); } // 接受连接 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept"); exit(EXIT_FAILURE); } // 接收数据 read(new_socket, buffer, 1024); printf("Client: %s\n", buffer); // 发送响应 send(new_socket, hello, strlen(hello), 0); printf("Hello message sent\n"); // 关闭连接 close(new_socket); close(server_fd); return 0; } ``` 3. **权限问题**:在 Linux 系统中,绑定低于 1024 的端口需要管理员权限。可以使用 `sudo` 命令以管理员身份运行程序。 4. **IP 地址问题**:确保指定的 IP 地址是有效的,并且与系统的网络接口关联。可以使用 `ifconfig` 命令来查看系统的网络接口和 IP 地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值