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

做直播网站用什么程序高质量外链平台

做直播网站用什么程序,高质量外链平台,运维网站建设,网站制作公司如何运作基于UDP的网络聊天室 项目需求: 如果有用户登录,其他用户可以收到这个人的登录信息如果有人发送信息,其他用户可以收到这个人的群聊信息如果有人下线,其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器 #includ…

基于UDP的网络聊天室

项目需求:

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

服务器 

#include <myhead.h>
// #define SER_IP "192.168.141.134"
// #define SER_PORT 8888
typedef struct Node // 链表存储客户端的所有信息
{struct sockaddr_in cin; // 存储客户端的网络地址信息struct Node *next;
} *List;
typedef struct Message // 消息结构体
{char type;char name[20];char text[128];
} msg_t;
struct sockaddr_in cin; // 客户端地址信息结构体// 单链表节点创建函数
List create_node()
{List p = (List)malloc(sizeof(struct Node));if (NULL == p)return NULL;p->next = NULL;return p;
}
// 客户端链表尾插
List insert_rear(List head, struct sockaddr_in cin)
{List s = create_node();if (NULL == s)return head;s->cin = cin;if (NULL == head){head = s;return s;}else{List p = head;while (p->next != NULL)p = p->next;p->next = s;return head;}
}
// 客户端接入服务器通知函数
void chat_all_join(List head, msg_t msg, int sfd)
{List p = head;char buf[50] = "";while (p->next != NULL){snprintf(buf, sizeof(buf), "[%s:%d]%s加入聊天室\n", inet_ntoa(p->cin.sin_addr), ntohs(p->cin.sin_port), msg.name);sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));p = p->next;}
}
// 客户端消息转发函数
void chat_all(List head, struct Message msg, int sfd, struct sockaddr_in cin)
{List p = head;char rbuf[200] = "";while (p->next != NULL){snprintf(rbuf, sizeof(rbuf), "[%s:%d]%s:%s\n", inet_ntoa(p->cin.sin_addr), ntohs(p->cin.sin_port), msg.name, msg.text);sendto(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));p = p->next;}snprintf(rbuf, sizeof(rbuf), "[%s:%d]%s:%s\n", inet_ntoa(p->cin.sin_addr), ntohs(p->cin.sin_port), msg.name, msg.text);sendto(sfd, rbuf, sizeof(rbuf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));
}
// 客户端发送退出消息函数
void chat_all_quit(List head, struct Message msg, int sfd)
{char wbuf[200] = "";List p = head;while (p->next != NULL){snprintf(wbuf, sizeof(wbuf), "[%s:%d]%s:退出了聊天室\n", inet_ntoa(p->cin.sin_addr), ntohs(p->cin.sin_port), msg.name);sendto(sfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));p = p->next;}snprintf(wbuf, sizeof(wbuf), "[%s:%d]%s:退出了聊天室\n", inet_ntoa(p->cin.sin_addr), ntohs(p->cin.sin_port), msg.name);sendto(sfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));
}
// 链表中删除该地址信息
List exit_chat(List head)
{if (head->next == NULL) // 只有一个客户端时{free(head);head = NULL;return head;}List p = head;while (p->next != NULL) // 两个以上客户端{if (memcmp(&(p->next->cin), &cin, sizeof(cin)) == 0) // 找到p下一个节点地址信息符合的{List del = p->next;p->next = del->next;free(del);del = NULL;break;}else{p = p->next;}}return head;
}
int main(int argc, const char *argv[])
{// 创建通信的套接字文件描述符int sfd = -1;if ((sfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket error");return -1;}// 快速刷新端口号int reuse = -1;if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}if (argc < 3){fprintf(stderr, "请输入ip和端口号\n");return -1;}// 给当前套接字绑定结构体信息struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(atoi(argv[2]));sin.sin_addr.s_addr = inet_addr(argv[1]);if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}// 准备文件描述符容器fd_set readfds, tempfds;FD_ZERO(&readfds);FD_SET(0, &readfds);FD_SET(sfd, &readfds);int maxfd = sfd;// 定义变量存放客户端地址信息结构体,及客户端消息struct sockaddr_in cin;socklen_t socklen = sizeof(cin);struct Message msg;List head = NULL;char buf[128] = "";while (1){tempfds = readfds;if (select(maxfd + 1, &tempfds, NULL, NULL, NULL) == -1){perror("select error");return -1;}// 收到消息if (FD_ISSET(sfd, &tempfds)){recvfrom(sfd, &msg, sizeof(msg), 0, (struct sockaddr *)&cin, &socklen);switch (msg.type){case 'L': // 客户端加入{head = insert_rear(head, cin); // 尾插入链表chat_all_join(head, msg, sfd);printf("[%s:%d]%s加入聊天室\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), msg.name);};break;case 'C': // 客户端消息{chat_all(head, msg, sfd, cin);printf("[%s:%d]%s:%s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), msg.name, msg.text);};break;case 'Q': // 客户端退出{chat_all_quit(head, msg, sfd);printf("[%s:%d]%s退出聊天室\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), msg.name);head = exit_chat(head);};break;default:printf("type error\ttype=%c\n", msg.type);return -1;}}// 发送消息if (FD_ISSET(0, &tempfds)){memset(buf, 0, sizeof(buf));fgets(buf, sizeof(buf), stdin);buf[strlen(buf) - 1] = '\0';char wbuf[56] = "";snprintf(wbuf, sizeof(wbuf), "***system***%s\n", buf);List p = head;while (p != NULL){sendto(sfd, wbuf, sizeof(wbuf), 0, (struct sockaddr *)&(p->cin), sizeof(p->cin));p = p->next;}}}return 0;
}

客户端

#include <myhead.h>
// #define SER_IP "192.168.141.128"
// #define SER_PORT 8888
struct Message
{char type;char name[20];char text[128];
};
int main(int argc, const char *argv[])
{struct Message msg;// 创建通信用套接字文件描述符int cfd = -1;if ((cfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){perror("socket error");return -1;}if (argc < 3){fprintf(stderr, "请输入ip和端口号\n");return -1;}// 填写服务器的地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(atoi(argv[2]));sin.sin_addr.s_addr = inet_addr(argv[1]);char name[20] = "";// 发送客户端的登录信息printf("请输入昵称:");fgets(name, sizeof(name), stdin);name[strlen(name) - 1] = '\0';strcpy(msg.name, name);msg.type = 'L';if (sendto(cfd, &msg, sizeof(msg), 0, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("sendto error");return -1;}else{printf("加入聊天服务器成功\n");}// 准备文件描述符容器fd_set readfds, tempfds;FD_ZERO(&readfds);FD_SET(0, &readfds);FD_SET(cfd, &readfds);int maxfd = cfd;while (1){tempfds = readfds;int res = select(maxfd + 1, &tempfds, NULL, NULL, NULL);if (res == -1){perror("select error");return -1;}// 发数据if (FD_ISSET(0, &tempfds)){memset(msg.text, 0, sizeof(msg.text));read(0, msg.text, sizeof(msg.text));msg.text[strlen(msg.text) - 1] = '\0';// 客户端退出if (strcmp(msg.text, "quit") == 0){msg.type = 'Q';sendto(cfd, &msg, sizeof(msg), 0, (struct sockaddr *)&sin, sizeof(sin));printf("本机已下线\n");close(cfd);return 0;}// 与其他客户端通信else{msg.type = 'C';sendto(cfd, &msg, sizeof(msg), 0, (struct sockaddr *)&sin, sizeof(sin));}}// 收数据if (FD_ISSET(cfd, &tempfds)){char buf[128] = "";// 不接收服务器的地址信息结构体recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);printf("%s", buf);fflush(stdout);}}return 0;
}
http://www.yayakq.cn/news/13666/

相关文章:

  • 广州定制型网站建设做网站前台用什么软件
  • 林州网站建设哪家专业江永网站建设
  • 百度网站安全在线检测免费建设视频网站
  • 河南网站备案地址网站优化 书
  • 网站后台数据库下载小程序获取wordpress背景音乐
  • 做关于时尚网站的目的小广告胶用什么可以快速清除
  • 一米八效果图网站一流的苏州网站建设
  • 网站seo博客网址的格式是什么样的
  • 网站文案案例如何推广网址链接
  • 网站排名首页怎么做如何重视企业网站的建设
  • wordpress主题侧边栏网站优化建设上海
  • 网站产品详情页怎么做网站上二维码怎么做的
  • php网站开发教学wordpress安装卡死
  • 网站建设网络推广首选公司东乡建设网站
  • 临沂购买模板建站公司网页设计项目简历
  • 齐河县工程建设监理有限公司网站鸿蒙最新版本
  • 广西城乡与住房建设厅网站在工商局网站如果做注销公告
  • 三合一网站管理系统怎么做的营销策略研究论文范文
  • 建设网站需要几个文件夹网站数据库制作
  • 建材网站建设成都python做网站后台
  • 厦门一个平台做网站啥的wordpress图片切换
  • 重庆李健做网站青岛网站制作机构
  • 中山网站制作策划oa系统下载手机版下载
  • 滁州项目建设公示在哪个网站网站设计师工资怎样
  • c 做特产网站做片头 网站
  • 什么叫网站建设四网合一做社交网站
  • 苏州惊天网站制作网一个简单的网页代码带图片
  • 建行网站首页登录网上银行重庆seo网站收录优化
  • 公司网站设计好昆明怎样优化网站
  • 常州模板网站建设域名跟网站的区别吗