1 Star 0 Fork 0

rukiTing/pythontest

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
server.c 3.44 KB
一键复制 编辑 原始数据 按行查看 历史
rukiTing 提交于 2025-04-22 21:47 +08:00 . socket通信,c从文件读出消息发给s
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <time.h>
#define PORT 8080
#define MAXSIZE 1024
#define EXIT_SYMBOL "exit"
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_len = sizeof(client_addr);
char buffer[MAXSIZE];
char file1_data[MAXSIZE];
int file1_fd, file2_fd;
ssize_t bytes_read, bytes_written;
int read_size;
srand((unsigned int)time(NULL));
// 创建socket文件描述符
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_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 = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// 绑定socket到端口
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
close(server_fd);
exit(EXIT_FAILURE);
}
// 监听连接请求
if (listen(server_fd, 5) == -1) {
perror("listen");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is listening on port %d...\n", PORT);
// 接受客户端连接
client_fd = accept(server_fd, (struct sockaddr*)&client_addr, &client_len);
if (client_fd == -1) {
perror("accept");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Client connected!\n");
// 打开file1进行读取
file1_fd = open("file1.txt", O_RDONLY);
if (file1_fd == -1) {
perror("open file1");
close(client_fd);
close(server_fd);
exit(EXIT_FAILURE);
}
// 打开file2进行写入
file2_fd = open("file2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (file2_fd == -1) {
perror("open file2");
close(file1_fd);
close(client_fd);
close(server_fd);
exit(EXIT_FAILURE);
}
// 客户端与服务器之间的通信循环
while (1) {
// 从客户端接收数据
bytes_read = read(client_fd, buffer, MAXSIZE-1);
if (bytes_read == -1) {
perror("read from client");
break;
}
buffer[bytes_read] = '\0'; // 确保字符串以null结尾
// 检查是否输入了退出符号
if (strncmp(buffer, EXIT_SYMBOL, strlen(EXIT_SYMBOL)) == 0) {
printf("Received exit command from client.\n");
break;
}
// 将接收到的数据写入file2
write(file2_fd, buffer, bytes_read);
// 从file1读取数据并发送给客户端
lseek(file1_fd, 0, SEEK_SET); // 每次从文件开头读取
bytes_read = read(file1_fd, file1_data, MAXSIZE-1);
if (bytes_read == -1) {
perror("read from file1");
break;
}
file1_data[bytes_read] = '\0'; // 确保字符串以null结尾
// 生成一个随机的数据长度
int data_len =rand() % bytes_read + 1;
// 发送数据到客户端
bytes_written = write(client_fd, file1_data, data_len);
if (bytes_written == -1) {
perror("write to client");
break;
}
}
// 关闭文件描述符和socket
close(file1_fd);
close(file2_fd);
close(client_fd);
close(server_fd);
printf("Server closed.\n");
return 0;
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/rukiting/pythontest.git
git@gitee.com:rukiting/pythontest.git
rukiting
pythontest
pythontest
test1

搜索帮助