2024-3-7-网络编程小项目

ser.c

#include <myhead.h>
#define SER_IP "10.168.1.111" //服务器IP
#define SER_PORT 8888         //服务器端口号
struct User
{char username[20];struct sockaddr_in cin;
};
int main(int argc, const char *argv[])
{struct User ur[1024];//1、创建用于监听的套接字int sfd = -1;sfd = socket(AF_INET, SOCK_STREAM, 0);if (sfd == -1){perror("socket error");return -1;}printf("sfd = %d\n", sfd);//将端口号快速重用int reuse = 1;if (setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1){perror("setsockopt error");return -1;}printf("端口号快速重用成功\n");//2、绑定ip地址和端口号//2.1填充地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                //地址族sin.sin_port = htons(SER_PORT);          //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //IP地址//2.2绑定if (bind(sfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("bind error");return -1;}printf("bind success\n");//3、启动监听,允许客户端连接if (listen(sfd, 128) == -1){perror("listen error");return -1;}printf("listen success\n");struct sockaddr_in cin;          //用于接收客户端地址信息结构体socklen_t socklen = sizeof(cin); //用于接收客户端地址信息的大小int newfd = -1;                  //新创建用于通信的套接字文件描述符char sbuf[128] = "";             //从键盘上输入数据//1、创建文件描述符容器fd_set readfds, tempfds;//2、清空容器内容FD_ZERO(&readfds);//3、将sfd和0号文件描述符放入容器中FD_SET(0, &readfds);FD_SET(sfd, &readfds);int maxfd = sfd;                  //存放容器中最大的文件描述符的值struct sockaddr_in cin_arr[1024]; //存放客户端对应的地址信息while (1){tempfds = readfds; //将要检测的容器复制保存一份int res = select(maxfd + 1, &tempfds, NULL, NULL, NULL); //阻塞等待集合中事件产生if (res == -1){perror("select error");return -1;}else if (res == 0){printf("time out\n");return -1;}//遍历所有的容器中的文件描述符for (int i = 0; i <= maxfd; i++){//判断当前的文件描述符是否在tempfds中,如果不在,直接下一个if (!FD_ISSET(i, &tempfds)){continue;}//如果程序执行到此,说明检测的集合中的i文件描述符产生了事件if (i == sfd) //表示sfd触发了事件{newfd = accept(sfd, (struct sockaddr *)&cin, &socklen);if (newfd == -1){perror("accept error");return -1;}recv(newfd, ur[newfd].username, sizeof(ur[newfd].username), 0);printf("%s [%s:%d]登陆成功\n", ur[newfd].username, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));//将客户端文件描述符放入到集合中FD_SET(newfd, &readfds);cin_arr[newfd] = cin; //将新的客户端地址信息放入容器//更新一下maxfdif (newfd > maxfd){maxfd = newfd;}bzero(sbuf, sizeof(sbuf));sprintf(sbuf, "-----%s登陆成功-----", ur[newfd].username);//将消息发给每一个客户端for (int k = 4; k <= maxfd; k++){if (k == i)continue;send(k, sbuf, strlen(sbuf), 0);}}else if (i == 0) //表示有终端输入事件{bzero(sbuf, sizeof(sbuf));//从键盘输入数据fgets(sbuf, sizeof(sbuf), stdin);sbuf[strlen(sbuf) - 1] = 0;char buf[128] = "**system**:";strcat(buf, sbuf);for (int k = 4; k <= maxfd; k++){send(k, buf, strlen(buf), 0);}}else{//5、通信套接字与客户端进行数据收发char rbuf[128] = "";//清空容器bzero(rbuf, sizeof(rbuf));//从套接字中读取数据int res = recv(i, rbuf, sizeof(rbuf), 0);if (res == 0){sprintf(rbuf, "-----%s已下线-----", ur[i].username);for (int k = 4; k <= maxfd; k++){if (k == i)continue;send(k, rbuf, strlen(rbuf), 0);}bzero(ur[i].username, sizeof(ur[i].username));//6、关闭套接字close(i);//将当前文件描述符从容器中移除FD_CLR(i, &readfds);//更新maxfdfor (int j = maxfd; j >= 0; j--){if (FD_ISSET(j, &readfds)){maxfd = j;break;}}}else if (strcmp(rbuf, "quit") != 0){printf("%s [%s:%d]chat成功\n", ur[i].username, inet_ntoa(cin.sin_addr), ntohs(cin.sin_port));char wbuf[128] = "";strcat(wbuf, ur[i].username);strcat(wbuf, ":");strcat(wbuf, rbuf);// 将消息发给每一个客户端for (int k = 4; k <= maxfd; k++){if (k == i)continue;send(k, wbuf, strlen(wbuf), 0);}}bzero(rbuf,sizeof(rbuf));}}}close(sfd);return 0;
}

cli.c

#include <myhead.h>
#define SER_IP "10.168.1.111" //服务器ip
#define SER_PORT 8888         //服务器端口号
struct Msg
{// char type; //log   char   quitchar username[20];char msgText[1024];
};
int main(int argc, const char *argv[])
{struct Msg ur = {0, 0};//1、创建用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if (cfd == -1){perror("socket error");return -1;}//2、绑定(非必须)//3、连接服务器//3.1填充要连接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET;                //地址族sin.sin_port = htons(SER_PORT);          //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //ip地址printf("请输入姓名>>>");scanf("%s", ur.username);getchar();//3.2 连接服务器if (connect(cfd, (struct sockaddr *)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}printf("connect success\n");//登入信息send(cfd, ur.username, strlen(ur.username), 0);struct pollfd pfd[2];pfd[0].fd = 0;pfd[0].events = POLLIN;pfd[1].fd = cfd;pfd[1].events = POLLIN;//4、数据收发// char wbuf[128] = "";while (1){int res = poll(pfd, 2, -1);if (res == -1){perror("poll error");return -1;}else if (res == 0){printf("time out\n");return -1;}if (pfd[0].revents == POLLIN){//清空数据bzero(&ur.msgText, sizeof(ur.msgText));// printf("请输入>>>");fgets(ur.msgText, sizeof(ur.msgText), stdin); //从终端输入ur.msgText[strlen(ur.msgText) - 1] = 0;//将数据发送给服务器send(cfd, ur.msgText, strlen(ur.msgText), 0);// printf("发送成功\n");//判断发送的数据if (strcmp(ur.msgText, "quit") == 0){break;}}if (pfd[1].revents == POLLIN){//接收服务器发来的消息//清空数据bzero(ur.msgText, sizeof(ur.msgText));recv(cfd, ur.msgText, sizeof(ur.msgText), 0);printf("%s\n", ur.msgText);}}//5、关闭套接字close(cfd);return 0;
}

演示视频:

网络编程小项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hi3861编译问题:SDK路径过长

Hi3861编译问题&#xff1a; 这个因为路径过程&#xff0c;把sdk直接放到根目录下就可以编译过了。 也遇到过海思其他平台在vscode下编译路径过长导致编译失败。 [DevTools] D:\DevEcoProjects\hi3861_hdu_iot_application\src>hb build [OHOS INFO] ohos_build_compiler: …

LV15 day5 字符设备驱动读写操作实现

一、读操作实现 ssize_t xxx_read(struct file *filp, char __user *pbuf, size_t count, loff_t *ppos); 完成功能&#xff1a;读取设备产生的数据 参数&#xff1a; filp&#xff1a;指向open产生的struct file类型的对象&#xff0c;表示本次read对应的那次open pbuf&#…

国内用ChatGPT可以吗

PS: 无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 tj4.mnsfdx.net 点击跳转链接 国内用ChatGPT可以吗&#xff1f;简单来说&#xff0c;是可以的&#xff0c;国内可以使用ChatGPT。ChatGPT是一款实体机器翻译工具&#xff0c;也是一种人工智能技术&…

数据结构(八)——初识单链表

&#x1f600;前言 单链表是数据结构中最基本的一种链表结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。单链表具有灵活性和动态性&#xff0c;可以根据需要插入、删除和查找元素&#xff0c;适用于各种场景和问题的解决。 在本篇文章…

day7-网络编程

1>基于UDP的网络聊天室 Ser.c #include <myhead.h> #define SER_IP "10.211.55.9" // 服务器IP #define SER_PORT 9999struct user {char usrName[20];struct sockaddr_in cin; }; int main(int argc, char const *argv[]) {// 1.创建用于监听的套接字int…

MyBatis-Flex学习总结

写在前面的话 MyBatis-Flex 是一个优雅的 MyBatis 增强框架&#xff0c;它非常轻量、同时拥有极高的性能与灵活性。我们可以轻松的使用 Mybaits-Flex 链接任何数据库&#xff0c;其内置的 QueryWrapper 帮助我们极大的减少了 SQL 编写的工作的同时&#xff0c;减少出错的可能性…

Urban Elevations(UBA-211)

网址如下&#xff1a; Urban Elevations - UVA 221 - Virtual Judge (vjudge.net) 第三方网站的 说实话&#xff0c;我看英语看得头大 最近学了一堆stl的容器&#xff0c;比如map&#xff0c;set啥的&#xff0c;方便是很方便&#xff0c;但是导致我脑子里第一个念头就是用他…

鸿蒙开发岗成春招最大黑马,“金三银四”应届生如何突围?

一年一度春招时间到&#xff0c;技术岗位已成为众多人才竞相追求的“职业高地”&#xff0c;也是未来职业发展的重要方向之一。鸿蒙人才在春招市场上成为“香饽饽”&#xff0c;与往年不同的是&#xff0c;许多应届生放弃考公执念向程序员进攻&#xff0c;这一现象背后蕴含着深…

腾讯云服务器和阿里云服务器价格测评_2024年费用大PK

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

day52(vueJS)json-server模拟数据

json-server介绍&#xff1a;&#xff1a;&#xff1a;JSON Server 是一个用于快速搭建 REST API 的工具&#xff0c;它可以帮助我们在开发过程中快速模拟 一个后端 API 服务器&#xff0c;方便前端开发人员进行接口调试和开发。使用 JSON Server&#xff0c;你可以通过创建一个…

【Go】golang值交换,指针

package mainimport "fmt"func swap(a *int, b *int) int {var o into *a*a *b*b oreturn o}func main() {var a int 1var b int 2swap(&a, &b)fmt.Println(a, b) }这个函数接受两个整数指针作为参数&#xff0c;然后通过指针操作&#xff0c;交换它们所…

第三百八十七回

文章目录 1. 概念介绍2. 使用方法3. 示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形…

python 实现文件系统监控:实现文件增加、删除、修改的监听

在Python中&#xff0c;你可以使用watchdog库来实现文件系统监控功能。下面是一个基础的看门狗&#xff08;Watchdog&#xff09;示例&#xff0c;它会监视指定目录下的文件和子目录的变化&#xff0c;并对特定事件&#xff08;如文件创建、修改或删除&#xff09;做出响应&…

代码随想录算法训练营第二天|977、有序数组的平方

977. 有序数组的平方 已解答 简单 相关标签 相关企业 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,…

Linux设备模型(七) - Netlink

一&#xff0c;什么是netlink通信机制 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。Netlink 是一种特殊的 socket&#xff0c;它是 Linux 所特有的。 Netlink 是一种在内核与用户应用间进行双向数…

我的创作周年纪念日

机缘 最初成为创作者的初心&#xff1a;整理自己的知识体系&#xff0c;普及前端知识 实战项目中的经验分享日常工作学习过程中的记录通过文章进行技术交流归纳和整理自己的知识体系 收获 创作的过程中收获&#xff1a; 获得了909粉丝的关注获得了很多正向的反馈&#xff0c…

【C语言】终の指针(前篇)

个人主页点这里~ 指针初阶点这里~ 指针初阶2.0点这里~ 指针进阶点这里~ 终の指针 一、回调函数二、qsort函数1、整形比较2、结构数据比较①结构体②-> 的使用③结构数据比较 一、回调函数 回调函数就是⼀个通过函数指针调用的函数。 把一个函数的指针作为参数传递给另一…

.NET 8.0:塑造未来的技术革新

随着科技的不断发展&#xff0c;.NET 框架作为微软推出的开源、跨平台开发框架&#xff0c;已经成为全球数百万开发者的首选工具。作为.NET 框架的最新版本&#xff0c;.NET 8.0 带来了许多令人振奋的新特性和改进&#xff0c;旨在帮助开发者构建更高效、更可靠的应用程序。本文…

dubbo3适配springboot2.7.3

版本详细 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>3.0.3</version> </dependency><parent><groupId>org.springframework.boot</groupId><artifactId&…

leetcode热题100刷题计划

题目3 无重复字符的最长子串 思路 滑动窗口&#xff0c;设定当前窗口左侧为i&#xff0c;右侧为right&#xff0c;当到达右侧边界时&#xff0c;记录长度&#xff0c; 然后删掉最左侧的字符&#xff0c;即i1&#xff1b;right则继续向后搜。 代码 public int lengthOfLong…