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

}

相关推荐
几何心凉1 小时前
实践篇:青果IP助理跨境电商的高效采集
网络·网络协议·tcp/ip
群联云防护小杜2 小时前
为什么DDoS防御很贵?
网络·网络协议·web安全·ddos
学Linux的语莫2 小时前
ansible变量
linux·运维·服务器·ansible
Dearrrrrrrr2 小时前
H3C OSPF 多区域实验
网络·计算机网络·智能路由器
爱吃喵的鲤鱼2 小时前
Linux——文件系统清尾、动静态库
linux·运维·服务器
fpcc2 小时前
c++应用网络编程之十五Nagle算法
网络·c++
最数据3 小时前
Linux或者Docker中时区查询和修改(差8小时问题)
linux·运维·服务器·docker·.net
mahuifa3 小时前
ubuntu设置程序开机自启动
服务器·ubuntu·开机自启动
皓月盈江3 小时前
Linux宝塔部署wordpress网站更换服务器IP后无法访问管理后台和打开网站页面显示错乱
linux·服务器·wordpress·无法访问wordpess后台·打开网站页面错乱·linux宝塔面板·wordpress更换服务器
网络安全King3 小时前
[网络安全系列面试题] GET 和 POST 的区别在哪里?
网络·安全·web安全