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

9.9网编简单TCP,UDP的实现day2

TCP

#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>      //套接字的头文件
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<string.h>
#define  SER_PORT  8888        //服务器端口号
#define SER_IP  "192.168.144.128"   //服务器IP地址 int main(int argc, const char *argv[])
{//1、创建一个用于连接的套接字文件描述符int sfd  = socket(AF_INET, SOCK_STREAM, 0);if(-1 == sfd){perror("socket  error");return -1;}printf("socket 成功 sfd = %d\n", sfd);          //3//设置套接字属性:允许端口号快速重用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");//4、阻塞等等客户端的连接,如果有新客户端连接,//则创建一个用于通信的套接字struct sockaddr_in cin;            //用于接受客户端套接字信息socklen_t addrlen = sizeof(cin);   //用于接受客户端套接字的长度int new_fd = accept(sfd, (struct sockaddr*)&cin, &addrlen);if(-1 == new_fd){perror("accept error");return -1;}printf("[%s:%d]发来连接,new_fd = %d\n", inet_ntoa(cin.sin_addr),\ntohs(cin.sin_port) ,new_fd);//5、使用新套接字跟客户端进行通信while(1){//从套接字中读取消息char rbuf[3] = "";          //存放接受消息的容器//int res = read(new_fd, rbuf, sizeof(rbuf)-1);int res = recv(new_fd, rbuf, sizeof(rbuf)-1, 0);if(res == 0){printf("客户端已下线\n");close(new_fd);break;}if(res == -1){perror("read error");close(new_fd);close(sfd);return -1;}//如果程序执行至此,表示数据成功读取下来,病放入rbuf中printf("[%s:%d] : %s\n", inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), rbuf);//给当前消息加个笑脸还回去
/*		strcat(rbuf, "*_*");//向套接字中写入消息//write(new_fd, rbuf, strlen(rbuf));send(new_fd, rbuf, strlen(rbuf), 0);printf("发送成功\n");
*/}//6、关闭监听套接字close(sfd);return 0;
}
#include<stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>      //套接字的头文件
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include<string.h>
#define  SER_PORT 8888               //服务器端口号
#define SER_IP "192.168.144.128"     //服务器ip地址
#define CLIENT_PORT 9999             //客户端端口号
#define CLIENT_IP "192.168.144.128" //客户端ip地址int main(int argc, const char *argv[])
{//1、创建一个用于通信的套接字文件描述符int cfd = socket(AF_INET, SOCK_STREAM, 0);if(-1 == cfd){perror("socket error");return -1;}printf("socket success   cfd = %d\n", cfd);//2、绑定IP地址和端口号(可选)//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地址//3.3 连接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("connect  error");return -1;}printf("连接成功\n");//4、数据收发while(1){char wbuf[128] = "";            //用于发送数据的容器fgets(wbuf, sizeof(wbuf), stdin);    //从终端获取消息wbuf[strlen(wbuf)-1] = '\0';         //将换行改成'\0'if(strcmp(wbuf, "quit") == 0){break;}//将数据发送给服务器//write(cfd, wbuf, strlen(wbuf));send(cfd, wbuf, strlen(wbuf), 0);printf("发送成功\n");//接收服务器发送的消息//read(cfd, wbuf, sizeof(wbuf));recv(cfd, wbuf, sizeof(wbuf), 0);printf("收到的消息为:%s\n", wbuf);}//5关闭套接字close(cfd);return 0;

UDP

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <25061head.h>
#define SER_IP "192.168.144.128"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//服务器端//socket创建套接字	int sfd=socket(AF_INET,SOCK_DGRAM,0);if(sfd==-1){ERR_MSG("socket error");return -1;}//bindstruct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("bind error");return -1;}//收发char buf[128]="";struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);printf("bind success\n");while(1){bzero(buf,sizeof(buf));if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)==-1){ERR_MSG("recv error");return -1;}if(strcmp(buf,"quit")==0){printf("退出程序\n");break;}printf("[%s:%d]发来消息:%s\n",inet_ntoa(cin.sin_addr),htons(cin.sin_port),buf);strcat(buf,"*--*");sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,addrlen);}close(sfd);return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <25061head.h>
#define SER_IP "192.168.144.128"
#define SER_PORT 8888
int main(int argc, const char *argv[])
{//客户端//创建socket套接字int cfd=socket(AF_INET,SOCK_DGRAM,0);if(cfd==-1){ERR_MSG("socket error");return -1;}//bind(可不写)//收发char buf[128]="";struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);printf("hello\n");while(1){bzero(buf,sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';sendto(cfd,buf,sizeof(buf),0,(struct sockaddr*)&sin,sizeof(sin));if(strcmp(buf,"quit")==0){printf("断开连接\n");return -1;}recv(cfd,buf,sizeof(buf),0);printf("收到消息:%s\n",buf);}close(cfd);//关闭套接字return 0;
}


文章转载自:

http://2nSiIlz5.rdpps.cn
http://ojzLGJxy.rdpps.cn
http://IzqB2JRn.rdpps.cn
http://Fvb95Lns.rdpps.cn
http://ltEIc9Pe.rdpps.cn
http://cDJBu9Z6.rdpps.cn
http://oKupbC7F.rdpps.cn
http://E1BFbHMl.rdpps.cn
http://rTp0qtJa.rdpps.cn
http://RxV1vZMg.rdpps.cn
http://LLB4o0rU.rdpps.cn
http://ZFM9e4uS.rdpps.cn
http://vxlGoxMb.rdpps.cn
http://yq49QSMQ.rdpps.cn
http://QVlyyN9m.rdpps.cn
http://PVss6VWd.rdpps.cn
http://ES3ENEtl.rdpps.cn
http://1fQmbN54.rdpps.cn
http://R7YcqwFK.rdpps.cn
http://zzEeZ1f1.rdpps.cn
http://p3NbTDJE.rdpps.cn
http://DUnr9IxZ.rdpps.cn
http://DY8Vnniw.rdpps.cn
http://T7BgmVng.rdpps.cn
http://xqQwRTfZ.rdpps.cn
http://17Yu8wrr.rdpps.cn
http://mofK42y9.rdpps.cn
http://Qr5ACmaB.rdpps.cn
http://EwWY8XW8.rdpps.cn
http://8ni70wMA.rdpps.cn
http://www.dtcms.com/a/374763.html

相关文章:

  • Day39 SQLite数据库操作与HTML核心API及页面构建
  • Vue3 与 AntV X6 节点传参、自动布局及边颜色控制教程
  • 线程与进程的区别
  • RAC概念笔记
  • 如何将视频从安卓手机传输到电脑?
  • Day04_苍穹外卖——套餐管理(实战)
  • ElementUI 组件概览
  • fifo之读写指针
  • 【第三次全国土壤普查】一键制备土壤三普环境变量23项遥感植被指数神器
  • Java反射机制详解
  • PDF文件中的广告二维码图片该怎么批量删除
  • 记一次 .NET 某中医药附属医院门诊系统 崩溃分析
  • WPF/Prism 中计算属性的通知机制详解 —— SetProperty 与 RaisePropertyChanged
  • jmeter使用指南
  • 硬件(六)arm指令
  • 后端错误处理的艺术:BusinessException 与 ResultUtils 的完美分工
  • MCU、CPLD、DSP、FPGA 有什么区别,该如何选择?
  • 【React Native】点赞特效动画组件FlowLikeView
  • android studio gradle 访问不了
  • 【C++】C++11 篇二
  • Kubernetes 配置检查与发布安全清单
  • Perforce Klocwork 2025.2版本更新:默认启用现代分析引擎、支持 MISRA C:2025 新规、CI构建性能提升等
  • 工业总线协议转换核心:SG-DP_MOD-110 Profibus-DP 转 Modbus-RTU 网关,打通异构设备数据链路
  • Win系统下配置PCL库第三步之链接库的路径(超详细)
  • 【远程运维】Linux 远程连接 Windows 好用的软件:MobaXterm 实战指南
  • Java入门级教程13-多线程同步安全机制synchronized(内置锁)、JavaMail发送电子邮箱、爬取CSDN到邮箱、备份数据库
  • 玩转Docker | 使用Docker部署KissLists任务管理工具
  • STL库——map/set(类函数学习)
  • STM32 串口接收数据包(自定义帧头帧尾)
  • 正向代理,反向代理,负载均衡还有nginx