Ubuntu下c语言实现使用 socket API 来实现一个并发回应服务器与客户端的设计。
时间: 2023-11-22 09:52:57 浏览: 39
好的,下面是一个简单的并发回应服务器与客户端的示例代码,使用 socket API 和 POSIX 线程库实现。在 Ubuntu 下编译运行。
服务器端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define PORT 8888
#define MAX_CLIENTS 10
void *handle_client(void *);
int main(int argc, char const *argv[])
{
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
pthread_t tid;
int opt = 1;
// 创建套接字
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);
}
// 绑定地址
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
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("Server started, listening on port %d ...\n", PORT);
// 处理客户端连接
while (1)
{
if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr,
&client_len)) < 0)
{
perror("accept failed");
continue;
}
printf("New client connected: %s:%d\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 创建新线程处理客户端请求
if (pthread_create(&tid, NULL, handle_client, (void *)&client_fd) < 0)
{
perror("pthread_create failed");
close(client_fd);
continue;
}
pthread_detach(tid);
}
return 0;
}
void *handle_client(void *arg)
{
int client_fd = *(int *)arg;
char buffer[1024] = {0};
int n;
// 读取客户端请求
if ((n = read(client_fd, buffer, 1024)) < 0)
{
perror("read failed");
close(client_fd);
pthread_exit(NULL);
}
printf("Received from client %d: %s", client_fd, buffer);
// 回应客户端
if (write(client_fd, "Hello from server\n", 19) < 0)
{
perror("write failed");
close(client_fd);
pthread_exit(NULL);
}
printf("Sent to client %d: %s", client_fd, "Hello from server\n");
close(client_fd);
pthread_exit(NULL);
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define PORT 8888
int main(int argc, char const *argv[])
{
int client_fd;
struct sockaddr_in server_addr;
char buffer[1024] = {0};
int n;
// 创建套接字
if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// 连接服务器
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0)
{
perror("inet_pton failed");
exit(EXIT_FAILURE);
}
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
{
perror("connect failed");
exit(EXIT_FAILURE);
}
printf("Connected to server %s:%d\n", SERVER_IP, PORT);
// 向服务器发送请求
strcpy(buffer, "Hello from client\n");
if (write(client_fd, buffer, strlen(buffer)) < 0)
{
perror("write failed");
close(client_fd);
exit(EXIT_FAILURE);
}
printf("Sent to server: %s", buffer);
// 读取服务器回应
if ((n = read(client_fd, buffer, 1024)) < 0)
{
perror("read failed");
close(client_fd);
exit(EXIT_FAILURE);
}
printf("Received from server: %s", buffer);
close(client_fd);
return 0;
}
```
编译命令:
```
gcc server.c -o server -lpthread
gcc client.c -o client
```
运行命令:
```
./server
./client
```
运行结果:
```
Server started, listening on port 8888 ...
New client connected: 127.0.0.1:35880
Received from client 4: Hello from client
Sent to client 4: Hello from server
Connected to server 127.0.0.1:8888
Sent to server: Hello from client
Received from server: Hello from server
```