网络编程:基于TCP和UDP的服务器、客户端

1.基于TCP通信服务器

程序代码:

  1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6     //1.创建用于监听的套接字7     int sfd=-1;8     sfd=socket(AF_INET,SOCK_STREAM,0);9     //参数1:IPv4的通信10     //参数2:使用TCP通信类型11     //参数3:参数2以确定通信类型,012     if(sfd==-1)13     {14         perror("socket error");15         return -1;16     }17     printf("sfd=%d\n",sfd);//3  返回文件描述符,最小分配原则18     //2.绑定IP地址和端口号19     //2.1填充地址信息结构体20     struct sockaddr_in sin;21     sin.sin_family=AF_INET;//地址族22     sin.sin_port=htons(SER_PORT);//要2字节无符号整数端口号(网络字节序)23     //将主机字节序转换为网络字节序24     sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址(sin的sin_addr的s_addr)25     //要IP地址的网络字节序,将点分十进制数据转换为4字节无符号整数的网络字节序26     //2.2绑定27     if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))==-1)28         //要绑定的套接字文件描述符,通用地址信号结构体,结构体大小29     {30         perror("bind error");31         return -1;32     }33     printf("bind success\n");34     //3.启动监听,允许客户端连接35     if(listen(sfd,128)==-1)36     {37         perror("listen error");38         return -1;39     }40     printf("listen success\n");41     //4.客户端发来连接请求后,创建新的用于通信的套接字42     //不想接收客户端地址信息结构体,则无需传参2,参343     //想要获取客户端地址信息结构体,要传入相关参数44     struct sockaddr_in cin;//用于接收客户端地址信息结构体45     socklen_t socklen=sizeof(cin);//用于接收客户端地址信息大小46     int newfd=accept(sfd,(struct sockaddr*)&cin,&socklen);47     //阻塞等待客户端请求,客户端发来连接请求后,创建新的套接字,返回套接字文件描述符48     //参数1:服务器套接字文件描述符49     //参数2:通用地址信号结构体,接收最新连接的客户端地址信息50     //参数3:客户端套接字大小,地址传递51     if(newfd==-1)//成功返回套接字文件描述符,失败-152     {53         perror("accept error");54         return -1;55     }56     printf("newfd=%d您有新的客户已经上线\n",newfd);57     printf("客户端IP:%s,端口号:%d\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));58     //将IP地址的网络字节序(4字节无符号整数)转换为点分十进制字符串(IP地址的网络字节序)59     //将端口的网络字节序(2字节无符号整数)转换为主机字节序(端口的网络字节序)60     //5.通信套接字与客户端进行数据收发61     char rbuf[128]="";62     while(1)63     {64         //清空容器65         bzero(rbuf,sizeof(rbuf));66         //从套接字中读取数据67         int res=read(newfd,rbuf,sizeof(rbuf));68         if(res==0)69         {70             printf("客户端已下线\n");71             break;72         }73         printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),rbuf);74         //将收到的消息加上其他字符回过去75         strcat(rbuf,"*_*");76         write(newfd,rbuf,strlen(rbuf));77     }78     //6.关闭套接字79     close(newfd);80     close(sfd);81     return 0;82 }   

运行结果:

2. 基于TCP通信客户端

程序代码:

  1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6     //1.创建用于通信的套接字文件描述符7     int cfd=socket(AF_INET,SOCK_STREAM,0);8     //使用IPv4通信,使用TCP通信类型,已确定通信类型09     if(cfd==-1)10     {11         perror("socket error");12         return -1;13     }14     printf("cfd=%d\n",cfd);//返回文件描述符,最小分配315     //2.绑定(不写系统默认绑定)16     //3.连接服务器17     //3.1填充要连接的服务器地址信息结构体18     struct sockaddr_in sin;19     sin.sin_family=AF_INET;//地址族20     sin.sin_port=htons(SER_PORT);//端口号21     sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址22     //3.2连接服务器23     if(connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1)24     {25         perror("connect error");26         return -1;27     }28     printf("connect success\n");29     //4数据收发30     char wbuf[128]="";31     while(1)32     {33         //清空数据34         bzero(wbuf,sizeof(wbuf));35         printf("请输入>>>");36         fgets(wbuf,sizeof(wbuf),stdin);//终端输入37         wbuf[strlen(wbuf)-1]=0;38         //将数据发送给服务器39         send(cfd,wbuf,strlen(wbuf),0);40         printf("发送成功\n");41         if(strcmp(wbuf,"quit")==0)42             break;43         //接收服务器发来的消息44         //清空数据45         bzero(wbuf,sizeof(wbuf));46         recv(cfd,wbuf,sizeof(wbuf),0);47         printf("收到消息为;%s\n",wbuf);48     }49     //5.关闭套接字50     close(cfd);51     return 0;52 }                                                                                             
~            

运行结果:

3.基于UDP通信服务器

程序代码:

  1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6     //1.创建用于通信的套接字7     int sfd=socket(AF_INET,SOCK_DGRAM,0);8     if(sfd==-1)9     {10         perror("socket error");11         return -1;12     }13     printf("sfd=%d\n",sfd);14     //2.绑定IP地址和端口号15     //2.1填充地址信息结构体16     struct sockaddr_in sin;17     sin.sin_family=AF_INET;//地址族18     sin.sin_port=htons(SER_PORT);//端口号19     sin.sin_addr.s_addr=inet_addr(SER_IP);//IP地址20     //2.2绑定21     if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1)22     {23         perror("bind error");24         return -1;25     }26     printf("bind success\n");27     //3.收发数据28     char rbuf[128]="";29     //定义容器接收对端地址信息结构体30     struct sockaddr_in cin;31     socklen_t socklen=sizeof(cin);32     while(1)33     {34         //清空数组35         bzero(rbuf,sizeof(rbuf));36         //接收数据37         recvfrom(sfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&cin,&socklen);38         printf("收到消息为:%s\n",rbuf);39         //将消息加*_*回过去40         strcat(rbuf,"*_*");41         if(sendto(sfd,rbuf,strlen(rbuf),0,(struct sockaddr*)&cin,socklen)=42         {43             perror("sendto error");44             return -1;45         }46     }47     //4.关闭套接字48     close(sfd);49     return 0;50 }      

运行结果:

4.基于UDP的客户端

程序代码:

  1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//IP地址3 #define SER_PORT 8888//服务器端口4 int main(int argc, const char *argv[])5 {6     //1.创建用于通信的套接字7     int cfd=socket(AF_INET,SOCK_DGRAM,0);8     if(cfd==-1)9     {10         perror("socket error");11         return -1;12     }13     printf("cfd=%d\n",cfd);14     //2.绑定IP地址和端口号15     //非必要16     //3.收发数据17     char wbuf[128]="";18     //定义容器,记录服务器的地址信息结构体19     struct sockaddr_in sin;20     sin.sin_family=AF_INET;21     sin.sin_port=htons(SER_PORT);22     sin.sin_addr.s_addr=inet_addr(SER_IP);23     while(1)24     {25         //清空数组26         bzero(wbuf,sizeof(wbuf));27         //从终端获取数据28         printf("请输入>>>");29         fgets(wbuf,sizeof(wbuf),stdin);30         wbuf[strlen(wbuf)-1]=0;31         //将数据发送给服务器32         sendto(cfd,wbuf,sizeof(wbuf),0,(struct sockaddr*)&sin,sizeof(sin));33         printf("发送成功\n");34         //接收服务器回复的消息35         bzero(wbuf,sizeof(wbuf));36         recvfrom(cfd,wbuf,sizeof(wbuf),0,NULL,NULL);37         printf("收到消息:%s\n",wbuf);38     }39     //关闭套接字40     close(cfd);41     return 0;42 }       

运行结果:

 流程图:

面试:

 

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

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

相关文章

AJAX 学习笔记(Day3)

「写在前面」 本文为黑马程序员 AJAX 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. AJAX 学习笔记&#xff08;Day1&#xff09; 目录 3 AJAX 原理 3.1 XMLHttpRequest 3…

记一次:android学习笔记一(学习目录-不要看无内容)

学习目录如下 B站学习的名称--Android开发从入门到精通(项目案例版) 网址:https://www.bilibili.com/video/BV1jW411375J/ 第0章:安装 android stoid 参考地址https://blog.csdn.net/adminstate/article/details/130542368 第一章:第一个安卓应用 第二章:用户界面设…

微信小程序-生命周期

页面生命周期 onLoad: 页面加载时触发的方法&#xff0c;在这个方法中可以进行页面初始化的操作&#xff0c;如获取数据、设置页面状态等。 onShow: 页面显示时触发的方法&#xff0c;在用户进入页面或从其他页面返回该页面时会调用此方法。可以在此方法中进行页面数据刷新、动…

迅为LS2K0500开发板邮票孔方式连接,CPU全部功能引出脚155个

CPU&#xff0c;迅为LS2K0500开发板采用龙芯2K0500处理器&#xff0c;基于龙芯自主指令系统 (LoongArch) 架构&#xff0c;片内集成64位LA264处理器核。实现ACPI、DVFS/DPM动态电源功耗管理等低功耗技术&#xff0c;支持多种电源级别和唤醒方式&#xff0c;可根据具体应用场景对…

C++11线程同步之互斥锁

C11线程同步之互斥锁 std::mutex成员函数线程同步 std::lock_guardstd::recursive_mutexstd::timed_mutex 进行多线程编程&#xff0c;如果多个线程需要对同一块内存进行操作&#xff0c;比如&#xff1a;同时读、同时写、同时读写对于后两种情况来说&#xff0c;如果不做任何的…

Linux之进程信号

目录 一、概念引入 1、生活中的信号 2、Linux中的信号 二、信号处理常见方式 三、信号的产生 1、键盘产生信号 2、系统调用接口产生信号 3、软件条件产生信号 4、硬件异常产生信号 四、信号的保存 相关概念 信号保存——三个数据结构 信号集——sigset_t 信号集操…

【推荐算法系列十八】:DSSM 召回算法

参考 推荐系统中 DSSM 双塔模型汇总&#xff08;二更&#xff09; DSSM 和 YouTubeDNN 都是比较经典的 U2I 模型。 U2I 召回 U2I 召回也就是 User-to-Item 召回&#xff0c;它基于用户的历史行为以及用户的一些个人信息&#xff0c;对系统中的候选物品进行筛选&#xff0c;挑…

十个勤天生菜原价4.9元被炒到300元,2024新商机!新兴创业项目!

近日&#xff0c;一则关于生菜价格暴涨的新闻引起了广泛关注。原价4.9元的生菜&#xff0c;在短短时间内被炒至300元&#xff0c;令人咋舌。在这背后&#xff0c;除了市场供需失衡、炒作等因素外&#xff0c;我们不禁思考&#xff1a;这样的现象背后是否隐藏着更大的商机&#…

免费AI绘画软件怎么使用?让你轻松成为绘画高手!

在科技日新月异的今天&#xff0c;人工智能(AI)已经渗透到我们生活的方方面面&#xff0c;而随着AI绘画软件的出现&#xff0c;正在引发一场艺术界的革命&#xff0c;它为我们的艺术创作提供了新的可能。那么免费AI绘画软件怎么使用? 1.选择一款合适的免费AI绘画软件&#xff…

微信小程序如何跳转页面

1.wx.navigateTo&#xff1a;用于跳转到其他页面&#xff0c;并保留当前页面。通过该 API 跳转后&#xff0c;可以通过返回按钮回到原页面。 wx.navigateTo({url: /pages/otherPage/otherPage })2.wx.redirectTo&#xff1a;用于跳转到其他页面&#xff0c;并关闭当前页面。通…

思维导图怎么画?收好这个思维导图绘制全攻略

思维导图怎么画&#xff1f;在当今这个信息爆炸的时代&#xff0c;思维导图作为一种高效的知识整理和思维工具&#xff0c;受到了越来越多人的青睐。那么&#xff0c;如何画出一幅既美观又实用的思维导图呢&#xff1f;那么今天就给大家介绍一下思维导图绘制的具体方法。 一、打…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——计算机组成原理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机组成原理 6、软件工程 7、大数据 8、英文 自我介绍 5. 组成原理 1. 计算机系统概论 1. 发展历史 早期计算器: 算盘->算筹-> 计算尺(工程师的身份象征)-> 机械计算机: 图灵:计算机世界的理论基…