首页 > 编程知识 正文

unix中有tcp和udp吗,udp双向通信

时间:2023-05-03 14:26:52 阅读:17450 作者:856

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/—在内核中创建套接字结构http://www.Sina.com /

将IP端口信息添加到通过创建套接字创建的套接字结构

1 .告诉操作系统主机应该将收到的哪些数据传递到当前套接字

2 .发送数据的发送源地址信息通信流程:

当前进程从指定套接字接收缓冲区接收数据Server:

要发送的数据放在套接字发送缓冲区中,内核选择适当的情况,即3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://www.Sina.com

1.创建套接字

# include stdio.h # include unistd.h # include string.h # include arpa/inet.h//字节顺序转换接口头文件socket.h //套接字标头intmain(intargc,char *argv[] )/1 .创建套接字- -内核中的socket结构/////intsocket )地址类型返回- 1; //2 .套接字地址信息//int bind (操作句柄、当前地址信息、地址信息长度) struct sockaddr_in addr; 定义IPv4d地址结构的addr.sin_family=AF_INET; //定义地址类型为ipv4addr.sin_port=htons(9000 ); //设置地址端口addr.sin _ addr.s _ addr=inet _ addr (' 172.18.0.4 ' ); //将以点分隔的十进制主机的字节序转换为网络字节序intlen=sizeof(addr ); intret=bind(sockfd,) struct sockaddr * (addr,len ); if(ret0) ) perror (绑定错误(n ); 返回- 1; }while(1) (//3.接收数据(//recvfrom )操作句柄、空间地址、数据长度、标志、对方地址、对方地址长度) charbuf(1024 )={0}; struct sockaddr_in paddr; //定义目标地址信息结构intlen=sizeof (结构套接字addr _ in ); ret=recvfrom(sockfd,buf,1023,0,(struct sockaddr* ) paddr,len ); if(ret0) perror(recvfromerror ); 返回- 1; } uint 16 _ TC port=ntohs (paddr.sin _ port ); char * CIP=inet _ ntoa (paddr.sin _ addr ); printf (客户端- [ % s : % d ] say : % sn ',cip,cport,buf ); //4 .回复数据memset(buf,0x 00,1024 ); //初始化内存空间printf(serversay: )的flush(stdout; fgets(buf,1023,stdin );

//ssize_t sendto() ret = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&paddr, len); if (ret < 0 ) { perror("sendto error"); return -1; } } //5.关闭套接字 close(sockfd); return 0; }

updsocket.hpp

/* * 封装实现一个udpsocket类 * 通过实例化的对象调用对应的成员接口 * 可以实现udp客户端或服务端的搭建 */#include<cstdio>#include<iostream>#include<string>#include<unistd.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/socket.h>class UdpSocket{ private: int _sockfd; //套接字描述符 public: //构造函数 UdpSocket() :_sockfd(-1){} //1.创建套接字 bool Socket(){ //int socket(地址域类型,套接字类型,通信协议) _sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);//创建socket if(_sockfd<0){ perror("socket error"); return false; } return true; } //2.为套接字绑定地址信息 bool Bind(std::string &ip,uint16_t port){ struct sockaddr_in addr; //定义地址信息结构体 addr.sin_family=AF_INET; //地址域类型IPv4 addr.sin_port=htons(port); //主机字节序端口号转换为网络字节序端口号 addr.sin_addr.s_addr=inet_addr(ip.c_str()); //将字符串点分十进制IP地址转换为整型网络字节序IP地址 socklen_t len=sizeof(struct sockaddr_in); int ret; //int bind(套接字操作句柄,地址信息,地址信息长度) ret=bind(_sockfd,(struct sockaddr*)&addr,len); if(ret<0){ perror("bind error"); return false; } return true; } //3.接收数据 bool Recv(std::string *buf,std::string *ip=NULL,int *port=NULL){ struct sockaddr_in addr; socklen_t len=sizeof(struct sockaddr_in); char tmp[4096]={0}; //recvfrom(操作句柄,发送空间首地址,发送数据长度,标识符,对端地址信息,地址结构长度) int ret=recvfrom(_sockfd,tmp,4096,0,(sockaddr*)&addr,&len); if(ret<0){ perror("recvfrom error"); return false; } buf->assign(tmp,ret); //自带申请空间拷贝数据 if(ip!=NULL){ *ip=inet_ntoa(addr.sin_addr);//将网络字节序IP地址转换为字节串点分十进制IP地址 } if(port!=NULL){ *port=ntohs(addr.sin_port); //将网络端口号转换为主机端口号 } return true; } //4.发送数据 bool Send(std::string &data,const std::string &ip,const int port){ struct sockaddr_in addr; addr.sin_family=AF_INET; //地址域类型为IPv4 addr.sin_port=htons(port); //主机端口号转换为网络端口号 addr.sin_addr.s_addr=inet_addr(ip.c_str()); //将网络字节序IP地址转换为字节序串点分十进制IP地址 socklen_t len=sizeof(struct sockaddr_in); //ssize_t snedto(操作句柄,空间首地址,发送数据长度,标识符,对端地址信息,地址结构长度) int ret=sendto(_sockfd,data.c_str(),data.size(),0,(sockaddr*)&addr,len); if(ret<0){ perror("sendto error"); return false; } return true; } //5.关闭套接字 bool Close(){ if(_sockfd!=-1){ close(_sockfd); } return true; }};

udp_cli.cpp

#include"udpsocket.hpp" #define CHECK_RET(q) if((q)==false){return -1;} int main(){ UdpSocket sock; //1.创建套接字 CHECK_RET(sock.Socket()); //2.绑定地址信息(不推荐) while(1){ //3.发送数据 std::cout<<"client say: "; std::string buf; std::cin>>buf; CHECK_RET(sock.Send(buf,"172.17.0.4",9000)); //4.接收数据 buf.clear(); CHECK_RET(sock.Recv(&buf)); std::cout<<"server say:"<< buf<< "n"; } //5.关闭套接字 sock.Close(); return 0; }


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。