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

}

相关推荐
晚风予卿云月9 分钟前
【Linux】进程控制(二)——进程等待 全方位详解
linux·运维·服务器·进程控制·进程等待
NOVAnet20239 分钟前
SASE 透明模式:非侵入式部署,实现企业网络架构无感升级
网络·架构·零信任·sd-wan·sase
上天_去_做颗惺星 EVE_BLUE11 分钟前
【新 Linux 服务器上手全攻略】系统巡检、存储规划与开发环境初始化
linux·运维·服务器·ubuntu·macos·centos
Titan202415 分钟前
Linux文件系统
linux·服务器
团象科技23 分钟前
出海内容创作链路实地调研 关于GPU服务器视频渲染的落地观察
运维·服务器
c2385628 分钟前
linux文件权限深入了解(下)
linux·运维·服务器
Zh&&Li31 分钟前
保姆级安装AI全自动渗透工具(pentestswarm)
linux·运维·服务器·人工智能
骑士雄师33 分钟前
17.2 通过 Config 传入用户名 → 工具1存入 State → 工具2读取 State 并返回答案
服务器·windows·microsoft
天启HTTP43 分钟前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php
信息安全失业大专人员44 分钟前
网络可靠性之战——物理检测与网络逻辑检测
网络