#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int opt = 1;
int addrlen = sizeof(address);
char buffer[BUFFER_SIZE] = {0};
const char *hello = "Hello from server";
// 创建 socket 文件描述符
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置端口复用选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定 IP 地址和端口
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");
close(server_fd);
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 3) < 0) {
perror("listen failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 接受客户端连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// 读取客户端消息
read(new_socket, buffer, BUFFER_SIZE);
printf("Received from client: %s\n", buffer);
// 发送消息给客户端
send(new_socket, hello, strlen(hello), 0);
printf("Hello message sent\n");
// 关闭 socket
close(new_socket);
close(server_fd);
return 0;
}
socket() 函数创建一个 TCP 套接字。AF_INET 表示使用 IPv4 协议,SOCK_STREAM 表示使用 TCP 流式套接字。setsockopt() 函数设置端口复用选项,允许服务器在关闭后立即重新绑定同一端口。bind() 函数将套接字绑定到指定的 IP 地址和端口。listen() 函数使套接字进入监听状态,等待客户端连接。accept() 函数接受来自客户端的连接请求,并返回一个新的文件描述符用于通信。read() 和 send() 函数与客户端进行数据交互。close() 函数关闭套接字。这段代码实现了一个简单的 TCP 服务器,能够接收客户端连接并与其交换数据。
上一篇:linux 查看用户组
下一篇:linux打包命令
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站