2025年linux udp编程 绑定失败_udp socket编程

linux udp编程 绑定失败_udp socket编程简介 UDP 协议与 TCP 协议一样用于处理数据包 在 OSI 模型中 两者都位于传输层 处于 IP 协议的上一层 UDP 有不提供数据包分组 组装和不能对数据包进行排序的缺点 也就是说 当报文发送之后 是无法得知其是否安全完整到达的 代码实现 ifndef SOCKET HPP define SOCKET HPP include include include

简介

UDP协议与TCP协议一样用于处理数据包,在OSI模型中,两者都位于传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。

代码实现

#ifndef _SOCKET_HPP_
#define _SOCKET_HPP_
#include
#include
#include
#include
#include
#include
#define MAX_BUFFER 1024
using namespace std;
namespace Socket
{

typedef int Socket;
typedef string Ip;
typedef unsigned int Port;
typedef string Data;
typedef struct
{

Ip ip;
Port port;
}Address;
typedef struct
{

Address address;
Data data;
}Datagram;
struct sockaddr_in* to_sockaddr(Address* a)
{
struct sockaddr_in* ret;
ret=(struct sockaddr_in*) malloc (sizeof(struct sockaddr_in));
ret->sin_family = AF_INET;
inet_aton(a->ip.c_str(),&(ret->sin_addr));
ret->sin_port=htons(a->port);
return ret;
}
Address* from_sockaddr(struct sockaddr_in* address)
{
Address* ret;
ret=(Address*)malloc(sizeof(Address));
ret->ip = inet_ntoa(address->sin_addr);
ret->port = ntohs(address->sin_port);
return ret;
}
class Exception
{

private:
string _message;
public:
Exception(string error) {
this->_message = error; }
virtual const char* what() {
return this->_message.c_str(); }
};
class UDP
{

private:
Socket _socket_id;
bool _binded;
public:
UDP(void);
~UDP(void);
void close(void);
void bind(Port port);
void send(Ip ip, Port port, Data data);
Datagram receive();
};
UDP::UDP(void)
{

this->_socket_id = socket(AF_INET, SOCK_DGRAM, 0);
if (this->_socket_id == -1) throw Exception("[Constructor] Cannot create socket");
this->_binded = false;
}
UDP::~UDP(void)
{

}
void UDP::close(void)
{

shutdown(this->_socket_id, SHUT_RDWR);
}
void UDP::bind(Port port)
{

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_addr.s_addr=htonl(INADDR_ANY);
address.sin_port=htons(port);
if (this->_binded)
{

this->close();
this->_socket_id = socket(AF_INET, SOCK_DGRAM, 0);
}
// ::bind() calls the function bind() from (outside the namespace)
if (::bind(this->_socket_id, (struct sockaddr*)&address, sizeof(struct sockaddr_in)) == -1)
{

stringstream error;
error << "[listen_on_port] with [port=" << port << "] Cannot bind socket";
throw Exception(error.str());
}
this->_binded = true;
}
void UDP::send(Ip ip, Port port, Data data)
{

struct sockaddr_in address;
address.sin_family = AF_INET;
address.sin_port = htons(port);
inet_aton(ip.c_str(), &address.sin_addr);
if (sendto(this->_socket_id, (void*)data.c_str(), data.length() + 1, 0, (struct sockaddr*)&address, sizeof(struct sockaddr_in)) == -1)
{

stringstream error;
error << "[send] with [ip=" << ip << "] [port=" << port << "] [data=" << data << "] Cannot send";
throw Exception(error.str());
}
}
Datagram UDP::receive()
{

int size = sizeof(struct sockaddr_in);
char *buffer = (char*)malloc(sizeof(char) * MAX_BUFFER);
struct sockaddr_in address;
Datagram ret;
if (recvfrom(this->_socket_id, (void*)buffer, MAX_BUFFER, 0, (struct sockaddr*)&address, (socklen_t*)&size) == -1) throw Exception("[receive] Cannot receive");
ret.data = buffer;
ret.address.ip = inet_ntoa(address.sin_addr);
ret.address.port = ntohs(address.sin_port);
free(buffer);
return ret;
}
}
#endif // _SOCKET_HPP_

使用示例

UDP server

#include 
#include "Socket.hpp"
using namespace std;
int main(void)
{

try
{

Socket::UDP sock;
sock.bind(2000);
Socket::Datagram received = sock.receive();
cout << received.data << endl;
sock.send("127.0.0.1", 3000, "response");
sock.close();
}
catch (Socket::Exception &e)
{

cout << e.what() << endl;
}
return 0;
}

UDP client

#include 
#include "Socket.hpp"
using namespace std;
int main(void)
{

try
{

Socket::UDP sock;
sock.bind(3000);
sock.send("127.0.0.1", 2000, "request");
Socket::Datagram received = sock.receive();
cout << received.data << endl;
sock.close();
}
catch (Socket::Exception &e)
{

cout << e.what() << endl;
}
return 0;
}
编程小号
上一篇 2025-03-26 19:30
下一篇 2025-03-05 21:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/123898.html