#include <iostream>
#include <cstdio>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
class UdpSocket
{
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, uint32_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(_sockfd, (struct sockaddr*)&addr, len);
if (ret < 0) {
perror("bind error");
return false;
}
return true;
}
bool Send(const 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());
int ret;
socklen_t len = sizeof(struct sockaddr_in);
ret = sendto(_sockfd, data.c_str(), data.size(), 0, (struct sockaddr*)&addr, len);
if (ret < 0) {
perror("sendto error");
return false;
}
return true;
}
bool Recv(std::string *buf, std::string *ip = NULL, uint16_t *port = NULL) {
struct sockaddr_in addr;
socklen_t len = sizeof(struct sockaddr_in);
int ret;
char tmp[4096] = {
0};
ret = recvfrom(_sockfd, tmp, 4096, 0, (struct sockaddr*)&addr, &len);
if (ret < 0) {
perror("recvfrom error");
return -1;
}
buf->assign(tmp, ret);
if (ip != NULL) {
*ip = inet_ntoa(addr.sin_addr);
}
if (port != NULL) {
*port = ntohs(addr.sin_port);
}
return true;
}
void Close() {
close(_sockfd);
_sockfd = -1;
return ;
}
private:
int _sockfd;
};
#define CHECK_RET(q) if((q)==false){return -1;}
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("em: ./udp_cli 192.168.122.132 9000\n");
return -1;
}
std::string ip_addr = argv[1];
uint16_t port_addr = atoi(argv[2]);
UdpSocket sock;
CHECK_RET(sock.Socket());
while(1) {
std::cout << "client say: ";
fflush(stdout);
std::string buf;
std::cin >> buf;
sock.Send(buf, ip_addr, port_addr);
buf.clear();
sock.Recv(&buf);
std::cout << "server say: " << buf << std::endl;
}
sock.Close();
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(int argc, char *argv[])
{
if (argc != 3) {
printf("./udp_srv ip port em: ./udp_srv 192.168.122.132 9000\n");
return -1;
}
const char *ip_addr = argv[1];
uint16_t port_addr = 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);
addr.sin_addr.s_addr = inet_addr(ip_addr);
socklen_t len = sizeof(struct sockaddr_in);
int ret = bind(sockfd, (struct sockaddr*)&addr, len);
if (ret < 0) {
perror("bind error");
return -1;
}
while(1) {
char buf[1024] = {
0};
struct sockaddr_in cliaddr;
socklen_t len = sizeof(struct sockaddr_in);
int ret = recvfrom(sockfd, buf, 1023, 0, (struct sockaddr*)&cliaddr,&len);
if (ret < 0) {
perror("recfrom error");
close(sockfd);
return -1;
}
printf("client say: %s\n", buf);
printf("server say:");
fflush(stdout);
memset(buf, 0x00, 1024);
scanf("%s", buf);
ret =sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&cliaddr, len);
if (ret < 0) {
perror("sendto error");
close(sockfd);
return -1;
}
}
close(sockfd);
}