C语言编写一对一服务器客户端的应用程序,客户端使用TCP/UDP向服务器端发送请求日期和时间,服务器端在收到请求后,回答请求并显示出客户的地址
时间: 2024-02-17 15:01:22 浏览: 216
使用C语言实现服务器/客户端的UDP通信
好的,下面是C语言实现。
服务器端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <time.h>
#define PORT 8000
#define BUFFER_SIZE 1024
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
char buffer[BUFFER_SIZE];
time_t t;
struct tm *now;
// 创建TCP socket对象
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("创建socket失败");
exit(EXIT_FAILURE);
}
// 绑定服务器IP和端口
memset(&server_addr, 0, sizeof(server_addr));
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)) == -1) {
perror("绑定失败");
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 1) == -1) {
perror("监听失败");
exit(EXIT_FAILURE);
}
printf("服务器启动,等待客户端连接...\n");
while (1) {
// 接受客户端连接
socklen_t client_addr_len = sizeof(client_addr);
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (client_fd == -1) {
perror("接受客户端连接失败");
continue;
}
printf("客户端 %s:%d 连接成功!\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 接收客户端请求
memset(buffer, 0, BUFFER_SIZE);
if (recv(client_fd, buffer, BUFFER_SIZE, 0) == -1) {
perror("接收数据失败");
close(client_fd);
continue;
}
printf("客户端 %s:%d 请求日期时间:%s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buffer);
// 处理请求
time(&t);
now = localtime(&t);
strftime(buffer, BUFFER_SIZE, "当前时间为:%Y-%m-%d %H:%M:%S,客户端地址为:%s:%d", &now);
// 发送响应
if (send(client_fd, buffer, strlen(buffer), 0) == -1) {
perror("发送数据失败");
}
// 关闭连接
close(client_fd);
}
return 0;
}
```
客户端:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8000
#define BUFFER_SIZE 1024
int main() {
int client_fd;
struct sockaddr_in server_addr;
char buffer[BUFFER_SIZE];
// 创建TCP socket对象
client_fd = socket(AF_INET, SOCK_STREAM, 0);
if (client_fd == -1) {
perror("创建socket失败");
exit(EXIT_FAILURE);
}
// 连接服务器
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(PORT);
if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("连接失败");
exit(EXIT_FAILURE);
}
// 发送请求
char *request = "请求日期时间";
if (send(client_fd, request, strlen(request), 0) == -1) {
perror("发送数据失败");
exit(EXIT_FAILURE);
}
// 接收响应
memset(buffer, 0, BUFFER_SIZE);
if (recv(client_fd, buffer, BUFFER_SIZE, 0) == -1) {
perror("接收数据失败");
exit(EXIT_FAILURE);
}
printf("服务器响应:%s\n", buffer);
// 关闭连接
close(client_fd);
return 0;
}
```
当客户端运行时,它会连接到服务器并发送请求。服务器接收请求后,会返回当前日期时间和客户端地址。注意,这里使用的是TCP协议,如果要使用UDP协议,需要将socket类型改为SOCK_DGRAM,并且不需要建立连接。
阅读全文