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

}

相关推荐
Tisfy9 小时前
服务器 - 从一台服务器切换至另一台服务器(损失数十条访客记录)
运维·服务器
风中的微尘9 小时前
39.网络流入门
开发语言·网络·c++·算法
hsjkdhs9 小时前
网络编程之UDP广播与粘包问题
网络·网络协议·udp
猎板PCB黄浩10 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ajassi200011 小时前
linux C 语言开发 (八) 进程基础
linux·运维·服务器
yzx99101311 小时前
接口协议全解析:从HTTP到gRPC,如何选择适合你的通信方案?
网络·人工智能·网络协议·flask·pygame
程思扬12 小时前
利用JSONCrack与cpolar提升数据可视化及跨团队协作效率
网络·人工智能·经验分享·docker·信息可视化·容器·架构
init_236113 小时前
isis dis选举
网络
倔强的石头10614 小时前
【Linux指南】Makefile入门:从概念到基础语法
linux·运维·服务器
风_峰14 小时前
【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
网络·嵌入式硬件·tcp/ip·ubuntu·fpga开发