udp通信的实现

编程入门 行业动态 更新时间:2024-10-28 16:26:36

udp<a href=https://www.elefans.com/category/jswz/34/1769529.html style=通信的实现"/>

udp通信的实现

用户端:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
int main(int argc,char *argv[])
{if(argc!=3){printf("输入错误,请重传 传输应带上本机ip和端口信息\n");return -1;}char *srv_ip=argv[1];uint16_t srv_port=atoi(argv[2]);int sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(sockfd<0){perror("socket error");return -1;}/*struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=inet_addr(ip);socklen_t len=sizeof(addr);int ret=bind(sockfd,(struct sockaddr*)&addr,len);if(ret<0){perror("bind error");return -1;}*/struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(srv_port);addr.sin_addr.s_addr=inet_addr(srv_ip);socklen_t len=sizeof(addr);while(1){char tmp[1024]={0};printf("client say:");scanf("%s",tmp);int ret =sendto(sockfd,tmp,strlen(tmp),0,(struct sockaddr*)&addr,len);if(ret<0){perror("sendto error");close(sockfd);return -1;}char buf[1024]={0};ret=recvfrom(sockfd,buf,1023,0,NULL,0);if(ret<0){perror("recvfrom error");close(sockfd);return -1;}printf("server say:%s\n",buf);}close(sockfd);return 0;
}
//创建套接字//绑定地址信息(客户端不推荐)
//发送数据
//接受数据
//关闭套接字

服务端头文件:

#include<cstdio>
#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
class UdpSocket{private:int _sockfd;public:UdpSocket():_sockfd(-1){}bool Socket(){_sockfd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);if(_sockfd<0){perror("socket error");return false;}return true;}bool Bind(const std::string &ip,uint16_t port){struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=inet_addr(ip.c_str());socklen_t len =sizeof(addr);if(bind(_sockfd,(struct sockaddr*)&addr,len)<0){perror("bind error");return false;}return true;}bool recv(std::string *buf,std::string *ip=NULL,uint16_t *port=NULL){char tmp[4096]={0};struct sockaddr_in peer_addr;socklen_t len=sizeof(peer_addr);int ret=recvfrom(_sockfd,tmp,4096,0,(struct sockaddr *)&peer_addr,&len);if(ret<0){perror("recvfrom error");return false;}buf->assign(tmp,ret);if(ip!=NULL){*ip=inet_ntoa(peer_addr.sin_addr);}if(port!=NULL){*port=ntohs(peer_addr.sin_port);}return true;}bool send(std::string &data,const std::string &ip,uint16_t port){struct sockaddr_in addr;addr.sin_family=AF_INET;addr.sin_port=htons(port);addr.sin_addr.s_addr=inet_addr(ip.c_str());socklen_t len=sizeof(addr);int ret=sendto(_sockfd,data.c_str(),data.size(),0,(struct sockaddr *)&addr,len);if(ret<0){perror("sendto error");return false;}return true;}bool Close(){if(_sockfd>=0){close(_sockfd);return true; }}
};

服务端实现代码:

#include"udp_srv.hpp"
#include<iostream>
int main(int argc,char *argv[])
{if(argc!=3){std::cout<<"输入错误,运行程序时应在后面加入本机的ip地址和端口号\n";return -1;}std::string ip=argv[1];u_int16_t port=std::stoi(argv[2]);UdpSocket sock;sock.Socket();sock.Bind(ip,port);while(1){std::string buf;std::string cli_ip;uint16_t cli_port;if(sock.recv(&buf,&cli_ip,&cli_port)==false){sock.Close();return -1;}std::cout<<"client say:"<<buf<<std::endl;buf.clear();std::cout<<"server say:";std::cin>>buf;if(sock.send(buf,cli_ip,cli_port)==false){sock.Close();return -1;}}sock.Close();return 0;
}

 

更多推荐

udp通信的实现

本文发布于:2023-06-15 06:42:05,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/722186.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:通信   udp

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!