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;
}
项目:完成局域网CS模型,局域网内一个服务器,多个客户端连接一个服务器,完成局域网聊天。
Tangver2024-09-16 1:02
相关推荐
几何心凉1 小时前
实践篇:青果IP助理跨境电商的高效采集群联云防护小杜2 小时前
为什么DDoS防御很贵?学Linux的语莫2 小时前
ansible变量Dearrrrrrrr2 小时前
H3C OSPF 多区域实验爱吃喵的鲤鱼2 小时前
Linux——文件系统清尾、动静态库fpcc2 小时前
c++应用网络编程之十五Nagle算法最数据3 小时前
Linux或者Docker中时区查询和修改(差8小时问题)mahuifa3 小时前
ubuntu设置程序开机自启动皓月盈江3 小时前
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱网络安全King3 小时前
[网络安全系列面试题] GET 和 POST 的区别在哪里?