写一个C创建tcp服务器
时间: 2024-03-09 14:50:23 浏览: 41
下面是一个简单的C语言程序,用于创建TCP服务器并监听客户端连接请求:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int server_fd, client_fds[MAX_CLIENTS], max_sd, activity, new_socket, valread;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建服务器套接字
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("server socket failed");
exit(EXIT_FAILURE);
}
// 设置服务器套接字选项
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定服务器套接字
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8888);
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听客户端连接请求
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Waiting for connections...\n");
// 处理客户端连接请求
while (1) {
fd_set readfds;
// 初始化文件描述符集
FD_ZERO(&readfds);
// 添加服务器套接字到文件描述符集
FD_SET(server_fd, &readfds);
max_sd = server_fd;
// 添加客户端套接字到文件描述符集
for (int i = 0; i < MAX_CLIENTS; i++) {
int sd = client_fds[i];
if (sd > 0)
FD_SET(sd, &readfds);
if (sd > max_sd)
max_sd = sd;
}
// 等待读取文件描述符集中的任何套接字
activity = select(max_sd + 1, &readfds, NULL, NULL, NULL);
if ((activity < 0) && (errno != EINTR)) {
printf("select error\n");
}
// 如果有新的客户端连接请求
if (FD_ISSET(server_fd, &readfds)) {
if ((new_socket = accept(server_fd, (struct sockaddr *)&server_addr, (socklen_t*)&server_addr)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
printf("New connection, socket fd is %d, address is %s, port is %d\n", new_socket, inet_ntoa(server_addr.sin_addr), ntohs(server_addr.sin_port));
// 将新的客户端套接字添加到客户端套接字数组中
for (int i = 0; i < MAX_CLIENTS; i++) {
if (client_fds[i] == 0) {
client_fds[i] = new_socket;
break;
}
}
}
// 处理客户端套接字的数据
for (int i = 0; i < MAX_CLIENTS; i++) {
int sd = client_fds[i];
if (FD_ISSET(sd, &readfds)) {
if ((valread = read(sd, buffer, BUFFER_SIZE)) == 0) {
// 客户端关闭连接
printf("Client disconnected, socket fd is %d\n", sd);
close(sd);
client_fds[i] = 0;
} else {
// 处理客户端发送的数据
buffer[valread] = '\0';
printf("Received data from client, socket fd is %d: %s\n", sd, buffer);
send(sd, buffer, strlen(buffer), 0);
}
}
}
}
return 0;
}
```
这个程序创建一个TCP服务器套接字,然后绑定到端口8888,并开始监听客户端连接请求。当有新的客户端连接请求时,它会接受连接并将客户端套接字添加到客户端套接字数组中。然后它使用select函数等待读取客户端套接字中的数据,一旦有数据可读,程序就会读取数据并将其发送回客户端。如果客户端关闭连接,它将从客户端套接字数组中删除该套接字。