通信效果:
源代码:
udpsocket.hpp
#pragma once
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
class udpsocket
{
public:
udpsocket():_sock(-1) {}
~udpsocket() {}
bool Socket(){
_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(_sock < 0){
perror("socket error");
return false;
}
return true;
}
bool Bind(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(struct sockaddr_in);
int ret = bind(_sock, (struct sockaddr*)&addr, len);
if(ret < 0){
perror("bind error");
return false;
}
return true;
}
bool Recv(std::string &buf, struct sockaddr_in *saddr){
char tmp[1500] = {0};
socklen_t len = sizeof(struct sockaddr_in);
int ret = recvfrom(_sock, tmp, 1500, 0,
(struct sockaddr*)saddr, &len);
if(ret < 0){
perror("recvfrom error");
return false;
}
buf.assign(tmp);
return true;
}
bool Send(std::string &buf, struct sockaddr_in *daddr){
socklen_t len = sizeof(struct sockaddr_in);
int ret = sendto(_sock, buf.c_str(), buf.size(), 0,
(struct sockaddr*)daddr, len);
if(ret < 0){
perror("sendto error");
return false;
}
return true;
}
bool Close(){
close(_sock);
_sock = -1;
}
private:
int _sock;
};
服务端:
udp_srv.cpp
#include "udpsocket.hpp"
#define CHECK_RET(q) if((q) == false){return -1;}
int main(int argc, char *argv[]){
if(argc != 3){
printf("./udp_srv ip port\n");
return -1;
}
std::string ip = argv[1];
uint16_t port = atoi(argv[2]);
udpsocket sock;
CHECK_RET(sock.Socket());
CHECK_RET(sock.Bind(ip, port));
while(1){
std::string buf;
struct sockaddr_in cli_addr;
CHECK_RET(sock.Recv(buf, &cli_addr));
std::cout<<"client say:"<<buf<<std::endl;
std::cout<<"server say:";
fflush(stdout);
std::cin>>buf;
CHECK_RET(sock.Send(buf, &cli_addr));
}
sock.Close();
return 0;
}
客服端:
udp_cli.cpp
#include "udpsocket.hpp"
#define CHECK_RET(q) if((q) == false){return -1;}
int main(int argc, char *argv[]){
if(argc != 3){
printf("./udp_cli ip port\n");
return -1;
}
std::string ip = argv[1];
uint16_t port = atoi(argv[2]);
udpsocket sock;
CHECK_RET(sock.Socket());
struct sockaddr_in srv_addr;
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(port);
srv_addr.sin_addr.s_addr = inet_addr(ip.c_str());
while(1){
std::string buf;
std::cout<<"client say:";
fflush(stdout);
std::cin>>buf;
CHECK_RET(sock.Send(buf, &srv_addr));
CHECK_RET(sock.Recv(buf, &srv_addr));
std::cout<<"server say:"<<buf<<std::endl;
}
sock.Close();
return 0;
}