项目:完成局域网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 buff1024;

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 buff1024;

while (1) {

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

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

buffstrcspn(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;

}

相关推荐
小HANN9 小时前
Linux建站实战:CentOS7+LNMP 从零部署 ECShop 开源电商系统
linux·运维·服务器·经验分享
数安旭说10 小时前
终端防火墙深度拆解:网络隔离、进程级管控与流量治理的落地避坑指南
网络·数据安全·企业安全·防火墙·终端安全·终端防火墙·违规外联
三84410 小时前
SSRF 从入门到实战:原理、危害与基础利用
服务器·网络安全·ssrf·#web安全
数智工坊10 小时前
NTIRE2024×4图像超分竞赛综述|Mamba崛起、数据缩放、频域增强成为新趋势
网络·人工智能·深度学习·cnn·机器人
聚美智数10 小时前
网安查询-备案查询-网络安全查询API接口介绍
网络·数据库·web安全
平原201811 小时前
GPT Image 2 / Nano Banana API成本拆解:$0.0081、84.7%与单张有效成本
linux·服务器·gpt
一个向上的运维者11 小时前
Kubernetes 网络三部曲:CNI、kube-proxy 与 CoreDNS 是如何协作的?
网络·容器·kubernetes
T1mzhou11 小时前
ARM64 Linux 6.10内核启动流程2-rootfs 怎么挂上
linux·服务器·前端
2301_8150910111 小时前
TCP 并发服务器模型:4 种 IO 模型完整梳理
服务器·网络·tcp/ip
斑马13911 小时前
Linux软件编程学习笔记(十二)——TCP并发服务器模型
java·服务器·网络