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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三少爷的剑!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值