通信的实现"/>
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通信的实现
发布评论