项目:完成局域网CS模型,局域网内一个服务器,多个客户端连接一个服务器,完成局域网聊天。

server.c
#include<myhead.h>

#define SERPORT 8888

#define SERIP "192.168.0.169"

#define BACKLOG 20

typedef struct {

int newfd; // 存储新文件描述符

struct sockaddr_in cin; // 存储客户端信息

} HMY;

void *fun1(void *sss) {

HMY *msg = (HMY *)sss;

int newfd = msg->newfd;

struct sockaddr_in cin = msg->cin; // 解析客户端信息

char buff[1024];

while (1) {

bzero(buff, sizeof(buff));

int len = recv(newfd, buff, sizeof(buff), 0);

if (len <= 0) {

printf("客户端 %s:%d 退出\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));

break;

}

printf("收到来自 %s:%d 的信息:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), buff);

// 发送消息给所有连接的客户端

send(newfd, buff, len, 0); // 回送消息

printf("发送成功\n");

}

close(newfd); // 关闭客户端连接

free(msg); // 释放内存

pthread_exit(NULL);

}

int main(int argc, const char *argv[]) {

int oldfd = socket(AF_INET, SOCK_STREAM, 0); // 1、创建套接字

if (oldfd == -1) {

perror("socket");

return -1;

}

int atao = 1;

if (setsockopt(oldfd, SOL_SOCKET, SO_REUSEADDR, &atao, sizeof(atao)) == -1) {

perror("setsockopt");

return -1;

}

printf("端口号快速复用成功\n");

struct sockaddr_in sin = {

.sin_family = AF_INET,

.sin_port = htons(SERPORT),

.sin_addr.s_addr = inet_addr(SERIP)

};

if (bind(oldfd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { // 2、绑定

perror("bind");

return -1;

}

if (listen(oldfd, BACKLOG) == -1) { // 3、监听成功

perror("listen");

return -1;

}

printf("监听成功\n");

while (1) {

struct sockaddr_in cin;

socklen_t cinlen = sizeof(cin);

int newfd = accept(oldfd, (struct sockaddr *)&cin, &cinlen); // 接收客户端请求

if (newfd == -1) {

perror("accept");

continue; // 继续接受其他连接

}

printf("%s:%d 发来请求\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));

HMY *msg = malloc(sizeof(HMY)); // 动态分配内存

if (msg == NULL) {

perror("malloc");

close(newfd);

continue; // 处理内存分配失败

}

msg->newfd = newfd;

msg->cin = cin;

pthread_t tid;

if (pthread_create(&tid, NULL, fun1, msg) != 0) {

perror("pthread_create");

free(msg); // 释放内存

close(newfd);

continue; // 处理线程创建失败

}

pthread_detach(tid); // 线程分离

}

close(oldfd); // 关闭旧的描述符

return 0;

}

client.c
#include<myhead.h>

#define SERVER_IP "192.168.0.169"

#define SERVER_PORT 8888

int main() {

int sockfd = socket(AF_INET, SOCK_STREAM, 0);

if (sockfd == -1) {

perror("socket");

return -1;

}

struct sockaddr_in server_addr;

server_addr.sin_family = AF_INET;

server_addr.sin_port = htons(SERVER_PORT);

server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);

if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {

perror("connect");

close(sockfd);

return -1;

}

printf("连接到服务器 %s:%d\n", SERVER_IP, SERVER_PORT);

char buff[1024];

while (1) {

printf("请输入消息 (输入 'exit' 退出): ");

fgets(buff, sizeof(buff), stdin);

buff[strcspn(buff, "\n")] = 0; // 去掉换行符

if (strcmp(buff, "exit") == 0) {

break; // 退出循环

}

send(sockfd, buff, strlen(buff), 0); // 发送消息

// 接收服务器的回送消息

bzero(buff, sizeof(buff));

int len = recv(sockfd, buff, sizeof(buff), 0);

if (len > 0) {

printf("服务器回送: %s\n", buff);

}

}

close(sockfd); // 关闭连接

return 0;

}

相关推荐
_.Switch32 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_8504108333 分钟前
文件系统和日志管理
linux·运维·服务器
qq_2546744134 分钟前
工作流初始错误 泛微提交流程提示_泛微协同办公平台E-cology8.0版本后台维护手册(11)–系统参数设置
网络
JokerSZ.37 分钟前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
一只哒布刘2 小时前
NFS服务器
运维·服务器
小松学前端3 小时前
第六章 7.0 LinkList
java·开发语言·网络
城南vision3 小时前
计算机网络——TCP篇
网络·tcp/ip·计算机网络
Ciderw4 小时前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
lihuhelihu4 小时前
第3章 CentOS系统管理
linux·运维·服务器·计算机网络·ubuntu·centos·云计算