用户端:
#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;
}