当前位置: 首页 > news >正文

怎么做网站加盟百度问答我要提问

怎么做网站加盟,百度问答我要提问,武汉做网站哪家公司好,传奇手游官网下载一.项目需求&#xff1a; 如果有用户登录&#xff0c;其他用户可以收到这个人的登录信息如果有人发送信息&#xff0c;其他用户可以收到这个人的群聊信息如果有人下线&#xff0c;其他用户可以收到这个人的下线信息服务器可以发送系统信息 二.服务器端 #include <myhead.h&…

一.项目需求:

  1. 如果有用户登录,其他用户可以收到这个人的登录信息
  2. 如果有人发送信息,其他用户可以收到这个人的群聊信息
  3. 如果有人下线,其他用户可以收到这个人的下线信息
  4. 服务器可以发送系统信息

二.服务器端

#include <myhead.h> //服务器
#define SER_IP "192.168.125.48"
#define SER_PORT 8888
#define MAX_CLIENTS 100
#define BUFFER_SIZE 1024typedef struct Node {struct sockaddr_in addr;char username[20];struct Node *next;
} Node, *List;typedef struct Msg {char type; // 'L' 登陆模式, 'M' 消息模式, 'Q' 下线模式, 'S' 系统消息char username[20];char message[BUFFER_SIZE];
} Message;List client_list = NULL;// 添加客户端
void add_client(struct sockaddr_in *addr, const char *username) {Node *node = malloc(sizeof(Node));memcpy(&(node->addr), addr, sizeof(struct sockaddr_in));strncpy(node->username, username, 19);node->next = client_list;client_list = node;
}// 移除客户端
void remove_client(Node *node) {Node **prev = &client_list;while (*prev && *prev != node) {prev = &(*prev)->next;}if (*prev) {Node *temp = *prev;*prev = node->next;free(temp);}
}// 广播消息
void broadcast_message(int sfd, const Message *msg,struct sockaddr_in *except_addr) {Node *current = client_list;Message to_send = *msg;to_send.message[sizeof(to_send.message) - 1] ='\0'; // 确保消息字符串以null终止while (current) {if (memcmp(&(current->addr), except_addr, sizeof(struct sockaddr_in)) !=0) {sendto(sfd, (const char *)&to_send, sizeof(Message), 0,(struct sockaddr *)&(current->addr),sizeof(struct sockaddr_in));}current = current->next;}
}// 查找客户端
Node *find_client_by_addr(struct sockaddr_in *addr) {Node *current = client_list;while (current) {if (memcmp(&(current->addr), addr, sizeof(struct sockaddr_in)) == 0) {return current;}current = current->next;}return NULL;
}int main() {int sfd = socket(AF_INET, SOCK_DGRAM, 0);if (sfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}int reuse = 1;if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) ==-1) {perror("setsockopt error");return -1;}struct sockaddr_in server_addr, client_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = inet_addr(SER_IP);server_addr.sin_port = htons(SER_PORT);if (bind(sfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) <0) {perror("bind failed");exit(EXIT_FAILURE);}printf("************服务器**************\n");printf("**********等待客户端**************\n");char buffer[BUFFER_SIZE] = {0};struct timeval tv;fd_set readfds;int max_fd = sfd;tv.tv_sec = 5;tv.tv_usec = 0;while (1) {FD_ZERO(&readfds);FD_SET(sfd, &readfds);// 检查是否有新的客户端连接或消息int res = select(max_fd + 1, &readfds, NULL, NULL, &tv);if (res < 0) {perror("select error");break;} else if (res > 0) {if (FD_ISSET(sfd, &readfds)) {socklen_t client_len = sizeof(client_addr);int n = recvfrom(sfd, buffer, BUFFER_SIZE, 0,(struct sockaddr *)&client_addr, &client_len);if (n < 0) {perror("recvfrom error");continue;}buffer[n] = '\0'; // 确保字符串以null终止Message msg;memcpy(&msg, buffer,(n < sizeof(Message))? n: sizeof(Message)); // 防止缓冲区溢出switch (msg.type) {case 'L': // 客户端登录add_client(&client_addr, msg.username);printf("%s 已登录\n", msg.username);// 广播登录信息给所有客户端(除了发送者)Message login_msg;strncpy(login_msg.username, msg.username, 19);login_msg.type = 'L';login_msg.message[0] = '\0'; // 清空消息字段,因为是登录消息broadcast_message(sfd, &login_msg, &client_addr);break;case 'M': // 客户端发送消息printf("%s: %s\n", msg.username, msg.message);// 广播消息给所有客户端(除了发送者)broadcast_message(sfd, &msg, &client_addr);break;case 'Q': // 客户端退出{Node *node = find_client_by_addr(&client_addr);if (node) {printf("%s 已下线\n", node->username);Message quit_msg;strncpy(quit_msg.username, node->username, 19);quit_msg.type = 'Q';quit_msg.message[0] ='\0'; // 清空消息字段,因为是下线消息remove_client(node);broadcast_message(sfd, &quit_msg, &client_addr);}} break;case 'S': // 服务器系统消息printf("系统消息: %s\n", msg.message);// 广播系统消息给所有客户端broadcast_message(sfd, &msg, NULL);break;default:printf("未知的消息类型\n");break;}}}}close(sfd);return 0;
}

三.客户端

#include <myhead.h>
#define SER_IP "192.168.125.48"
#define SER_PORT 8888
#define BUFFER_SIZE 1024typedef struct Msg {char type; // 'L' 登陆模式, 'M' 消息模式, 'Q' 下线模式, 'S' 系统消息char username[20];char message[BUFFER_SIZE];
} Message;int main() {int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (sockfd < 0) {perror("socket creation failed");exit(EXIT_FAILURE);}struct sockaddr_in sin;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(SER_IP);sin.sin_port = htons(SER_PORT);char username[20];printf("输入您的名字: ");scanf("%19s", username); // 限制输入长度为19个字符,为null终止符留空间// 发送登录消息Message login_msg;login_msg.type = 'L';strncpy(login_msg.username, username, sizeof(login_msg.username) - 1);login_msg.message[0] = '\0'; // 清空消息字段,因为是登录消息sendto(sockfd, &login_msg, sizeof(login_msg), 0, (struct sockaddr *)&sin,sizeof(sin));char message[BUFFER_SIZE];char recv_buffer[BUFFER_SIZE];struct sockaddr_in from_addr;socklen_t len = sizeof(from_addr);while (1) {printf("输入消息 (or 'exit' to quit): ");if (scanf("%1023s", message) == EOF || strcmp(message, "exit") == 0) {// 发送退出消息Message quit_msg;quit_msg.type = 'Q';strncpy(quit_msg.username, username, sizeof(quit_msg.username) - 1);quit_msg.message[0] = '\0'; // 清空消息字段,因为是退出消息sendto(sockfd, &quit_msg, sizeof(quit_msg), 0,(struct sockaddr *)&sin, sizeof(sin));break;}while (getchar() != '\n'); // 清除输入缓冲区中的换行符// 发送消息到服务器Message send_msg;send_msg.type = 'M';strncpy(send_msg.username, username, sizeof(send_msg.username) - 1);strncpy(send_msg.message, message, sizeof(send_msg.message) - 1);send_msg.message[sizeof(send_msg.message) - 1] ='\0'; // 确保消息字符串以null终止sendto(sockfd, &send_msg, sizeof(send_msg), 0, (struct sockaddr *)&sin,sizeof(sin));// 接收服务器的广播消息(可能是其他客户端的消息或系统消息)int n = recvfrom(sockfd, recv_buffer, BUFFER_SIZE, 0,(struct sockaddr *)&from_addr, &len);if (n > 0) {Message *msg = (Message *)recv_buffer;recv_buffer[n] = '\0'; // 确保字符串以null终止switch (msg->type) {case 'L': // 登录通知printf("%s 已登录\n", msg->username);break;case 'M': // 群聊消息printf("%s: %s\n", msg->username, msg->message);break;case 'Q': // 下线通知printf("%s 已下线\n", msg->username);break;case 'S': // 系统消息printf("系统消息: %s\n", msg->message);break;default:printf("未知的消息类型\n");break;}}}close(sockfd);return 0;
}

不完善仅供参考


文章转载自:
http://wanjiaetyma.xzLp.cn
http://wanjiaembodiment.xzLp.cn
http://wanjiaparvenu.xzLp.cn
http://wanjiaposse.xzLp.cn
http://wanjiaevocable.xzLp.cn
http://wanjiagreenshank.xzLp.cn
http://wanjiafount.xzLp.cn
http://wanjianorthallerton.xzLp.cn
http://wanjiachat.xzLp.cn
http://wanjiadimitrovo.xzLp.cn
http://wanjiadunedin.xzLp.cn
http://wanjiaelectuary.xzLp.cn
http://wanjiatedder.xzLp.cn
http://wanjiaeyecup.xzLp.cn
http://wanjiakaif.xzLp.cn
http://wanjiaabidjan.xzLp.cn
http://wanjiaprobability.xzLp.cn
http://wanjiajigger.xzLp.cn
http://wanjiadentiform.xzLp.cn
http://wanjiacacholong.xzLp.cn
http://wanjiasquiress.xzLp.cn
http://wanjiasoothe.xzLp.cn
http://wanjiarommany.xzLp.cn
http://wanjialunation.xzLp.cn
http://wanjiapeccadillo.xzLp.cn
http://wanjiaanhinga.xzLp.cn
http://wanjiawayfarer.xzLp.cn
http://wanjiayesman.xzLp.cn
http://wanjiabiomathcmatics.xzLp.cn
http://wanjiarsl.xzLp.cn
http://wanjiaprelude.xzLp.cn
http://wanjiaunbend.xzLp.cn
http://wanjiabibiolatrist.xzLp.cn
http://wanjiaextorsively.xzLp.cn
http://wanjiachronometrical.xzLp.cn
http://wanjiahaik.xzLp.cn
http://wanjiarehabilitate.xzLp.cn
http://wanjialamister.xzLp.cn
http://wanjiawoozy.xzLp.cn
http://wanjiabrushfire.xzLp.cn
http://wanjiachromaticity.xzLp.cn
http://wanjiaproblem.xzLp.cn
http://wanjiajab.xzLp.cn
http://wanjiaolfactronics.xzLp.cn
http://wanjiamalocclusion.xzLp.cn
http://wanjiasacerdotal.xzLp.cn
http://wanjiacoyote.xzLp.cn
http://wanjiaadenoid.xzLp.cn
http://wanjianicotinic.xzLp.cn
http://wanjiaaccordingly.xzLp.cn
http://wanjiatrimotored.xzLp.cn
http://wanjiarevulsion.xzLp.cn
http://wanjiaequivalency.xzLp.cn
http://wanjiaprosobranch.xzLp.cn
http://wanjiacenturied.xzLp.cn
http://wanjialawrencium.xzLp.cn
http://wanjiaentomostracan.xzLp.cn
http://wanjiashopworn.xzLp.cn
http://wanjiaparamyosin.xzLp.cn
http://wanjiafinicky.xzLp.cn
http://wanjiacoinsure.xzLp.cn
http://wanjiaempty.xzLp.cn
http://wanjiawane.xzLp.cn
http://wanjiawitticize.xzLp.cn
http://wanjiamadras.xzLp.cn
http://wanjiachateau.xzLp.cn
http://wanjiacomisco.xzLp.cn
http://wanjiarente.xzLp.cn
http://wanjiapentium.xzLp.cn
http://wanjialarvivorous.xzLp.cn
http://wanjiasulu.xzLp.cn
http://wanjiatrispermous.xzLp.cn
http://wanjiaked.xzLp.cn
http://wanjiamanet.xzLp.cn
http://wanjiaganzfeld.xzLp.cn
http://wanjiasummon.xzLp.cn
http://wanjiaproglottid.xzLp.cn
http://wanjiashaggy.xzLp.cn
http://wanjiahymn.xzLp.cn
http://wanjiauniatism.xzLp.cn
http://www.15wanjia.com/news/128507.html

相关文章:

  • 建设维护网站 未签订合同佛山百度网站快速排名
  • 做网站怎么插入音乐搜索引擎收录查询
  • 网站流量是如何计算的网站seo排名优化工具在线
  • 网站图标按钮用什么做seo的方法
  • 学风建设专题网站网络销售平台有哪些
  • 网站优化软件排名优化设计七年级下册语文答案
  • 做苗木的哪个网站效果好中国时事新闻网
  • 四川省送变电建设有限责任公司网站广告设计网站
  • 青岛做教育的网站建设百度老年搜索
  • 做网站找我要服务器密码网站seo
  • 做网店有哪些拿货网站关键词全网搜索
  • 武汉网站关键词优化网络推广技术外包
  • 泰国做彩票网站手机优化软件排名
  • 重庆网站建设小能手百度搜索一下
  • 美发企业网站模板网站关键词优化代理
  • 在线建设网站百度关键词排名软件
  • 做的门户网站怎么绑定ip地址网站建设流程图
  • 做网站联系电话百度百度百度一下
  • 卖渔具的亲戚做网站网络营销企业有哪些
  • 网站 备案 中国 名字网络营销以什么为中心
  • 公司网站需要服务器吗windows优化大师官方免费下载
  • 海南网站建设推荐网站排名监控工具
  • 网站程序开发教程互联网搜索引擎有哪些
  • 怎么做阿里妈妈推广网站广告外链购买平台
  • nas里安装wordpressseo服务公司
  • 国外h5网站模板下载南通关键词优化平台
  • 美女做暧暧视频网站软件开发公司排名
  • 网站banner图尺寸站长工具亚洲
  • 深圳网站制作公司新闻湖南长沙疫情最新消息
  • wordpress建站环境搭建电商软文范例100字