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

6.19作业

TCP服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define PORT 8888
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\}while(0)int main(int argc, const char *argv[])
{//创建流式套节奏int sfd=socket(AF_INET,SOCK_STREAM,0);if(sfd<0){ERR_MSG("socket");return -1;}printf("流式套节奏创建完毕 sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ipstruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器地址信息,必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}//将套节奏设置为被动监听状态if(listen(sfd,128)<0){ERR_MSG("listen");return -1;}printf("监听成功\n");//获取连接成功的客户端信息,生成一个新的套节奏文件描述符struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);int newfd=accept(sfd,(struct sockaddr*)&cin,&addrlen);if(newfd<0){ERR_MSG("accpet");return -1;}printf("[%s:%d] newfd=%d 客户端链接成功\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);char buf[128]="";ssize_t res;char buf2[128]="";ssize_t res2;while(1){bzero(buf,sizeof(buf));//接收res=recv(newfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(res==0){printf("[%s:%d]客户端下线\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port));break;}printf("[%s:%d]newfd=%d: %s\n",\inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);//发送res2=send(newfd,buf,sizeof(buf),0);if(res2<0){ERR_MSG("send");return -1;}printf("发送成功\n");}//关闭文件描述符if(close(sfd)<0){ERR_MSG("close");return -1;}return 0;
}

TCP客服端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>#define PORT 8888
#define IP "192.168.124.38"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d\n",__LINE__);\fprintf(stderr,"func:%s\n",__func__);\perror(msg);\}while(0)int main(int argc, const char *argv[])
{//创建流式套节奏int cfd=socket(AF_INET,SOCK_STREAM,0);if(cfd<0){ERR_MSG("socket");return -1;}printf("流式套节奏创建完毕 cfd=%d\n",cfd);//填充服务器地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip/*struct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式*/struct sockaddr_in sin2;sin2.sin_family=AF_INET;//必须填AF_INETsin2.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin2.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定客户端地址信息,不是必须绑定//未绑定由于电脑自动分配一个端口号/*if(bind(cfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}*///链接指定的服务器if(connect(cfd,(struct sockaddr*)&sin2,sizeof(sin2))<0){ERR_MSG("connect");return -1;}printf("连接服务器[%s:%d]成功\n",IP,PORT);char buf[128]="hello";ssize_t res;char buf2[128]="";ssize_t res2;while(1){bzero(buf,sizeof(buf2));		//发送printf("请输入:");fgets(buf2,sizeof(buf2),stdin);res2=send(cfd,buf2,sizeof(buf2),0);if(res2<0){ERR_MSG("send");return -1;}printf("发送成功\n");//接收bzero(buf,sizeof(buf));res=recv(cfd,buf,sizeof(buf),0);if(res<0){ERR_MSG("recv");return -1;}else if(res==0){printf("[%s:%d]cfd=%d服务器下线\n",IP,PORT,cfd);break;}printf("[%s:%d]newfd=%d : %s\n",IP,PORT,cfd,buf);}//关闭文件描述符if(close(cfd)<0){ERR_MSG("close");return -1;}return 0;
}

UDP服务器

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>      
#define PORT 6666
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建报式套节字int sfd = socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("sfd");return -1;}printf("报式套接字创建成功,sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器的地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ipstruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器的地址信息,必须绑定if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}printf("绑定成功\n");char buf[128]="";struct sockaddr_in cin;//存储接收到的对端的地址信息socklen_t addrlen=sizeof(cin);while(1){bzero(buf,sizeof(buf));//接收数据//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){ERR_MSG("recvrom");return -1;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);//发送数据strcat(buf,"*-*");if(sendto(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,sizeof(cin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");}//关闭套接字文件描述符close(sfd);return 0;
}

UDP客户端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>      
#define PORT 6666
#define IP "192.168.124.39"#define ERR_MSG(msg) do{\fprintf(stderr,"line:%d",__LINE__);\fprintf(stderr,"func:%s",__func__);\perror(msg);\
}while(0)int main(int argc, const char *argv[])
{//创建报式套节字int sfd = socket(AF_INET,SOCK_DGRAM,0);if(sfd<0){ERR_MSG("sfd");return -1;}printf("报式套接字创建成功,sfd=%d\n",sfd);//允许端口快速被复用int reuse = 1;if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0){ERR_MSG("setsockopt");return -1;}printf("允许端口快速重用\n");//填充服务器的地址信息结构体给bind函数使用//真实的地址信息结构体根据地址族制度,AF_INET-->>man 7 ip//填充对端地址信息结构体,给sestruct sockaddr_in sin;sin.sin_family=AF_INET;//必须填AF_INETsin.sin_port=htons(PORT);//端口号的网络字节序 1024~49151sin.sin_addr.s_addr=inet_addr(IP);//本机IP,ifconfig,必须是桥接模式//绑定服务器的地址信息,必须绑定/*if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("bing");return -1;}printf("绑定成功\n");*/char buf[128]="";char buf2[128]="";struct sockaddr_in cin;//存储接收到的对端的地址信息socklen_t addrlen=sizeof(cin);while(1){bzero(buf2,sizeof(buf));//发送数据printf("请输入:");fgets(buf2,sizeof(buf2),stdin);buf[strlen(buf)-1]='\0';if(sendto(sfd,buf2,sizeof(buf2),0,(struct sockaddr*)&sin,sizeof(sin))<0){ERR_MSG("sendto");return -1;}printf("发送成功\n");bzero(buf,sizeof(buf));//接收数据//if(recvfrom(sfd,buf,sizeof(buf),0,NULL,NULL)<0){if(recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cin,&addrlen)<0){ERR_MSG("recvrom");return -1;}printf("[%s:%d]:%s\n",inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),buf);}//关闭套接字文件描述符close(sfd);return 0;
}

相关文章:

  • Redis 键(key)
  • QTday5 2024-06-19
  • 视频监控管理平台智能边缘分析一体机安防监控平台离岗检测算法
  • MYSQL数据库安装
  • 【文档智能 RAG】RAG增强之路-智能文档解析关键技术难点及PDF解析工具PDFlux
  • 【网络安全学习】漏洞扫描:-01- 漏洞数据库searchsploit的使用
  • 北京银行品牌价值提升160亿元首破千亿 位居《中国500最具价值品牌》榜第85位!
  • qt 5.6 qmake手册
  • php实现modbus CRC校验
  • HJ39判断两个IP是否属于同一子网(中)
  • java 线程之间通信-volatile 和 synchronized
  • MySQL版本发布模型
  • unity2d Ugui--Image城市道路汽车行驶
  • 多层级iframe下JS调用点击事件
  • Sui的Fastcrypto加密库刷新速度记录
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JS字符串转数字方法总结
  • Redash本地开发环境搭建
  • Spring Boot MyBatis配置多种数据库
  • SpringBoot几种定时任务的实现方式
  • Sublime text 3 3103 注册码
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 使用common-codec进行md5加密
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 双管齐下,VMware的容器新战略
  • 一份游戏开发学习路线
  • 再谈express与koa的对比
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​Redis 实现计数器和限速器的
  • ​ubuntu下安装kvm虚拟机
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #if #elif #endif
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (4.10~4.16)
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (补充)IDEA项目结构
  • (二)hibernate配置管理
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (十)T检验-第一部分
  • (十六)串口UART
  • (一)VirtualBox安装增强功能
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .Net 4.0并行库实用性演练
  • .NET Framework 3.5安装教程
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .NET企业级应用架构设计系列之应用服务器
  • .NET应用架构设计:原则、模式与实践 目录预览
  • [17]JAVAEE-HTTP协议
  • [AX]AX2012开发新特性-禁止表或者表字段