123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include <arpa/inet.h>
- #include <iostream>
- #include <stdexcept>
- #include <stdio.h> //printf
- #include <stdlib.h> //exit(0);
- #include <cstring> //memset
- #include <sys/socket.h>
- #include <unistd.h>
- #include <vector>
- #define SERVER "127.0.0.1"
- #define BUFLEN 1024 // Max length of buffer
- #define PORT 8888 // The port on which to send data
- class udpsocket {
- struct sockaddr_in addr;
- int s, slen = sizeof(addr);
- public:
- udpsocket(int port);
- udpsocket(const udpsocket&) = delete;
- udpsocket& operator=(const udpsocket&) = delete;
- udpsocket(udpsocket&&);
- udpsocket& operator=(udpsocket&&);
- void write(const std::string&,const std::string& dest, int port);
- void write(const std::vector<char>&,const std::string& dest, int port);
- std::vector<char> receive();
- void close();
- };
- udpsocket::udpsocket(int port) {
- if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
- throw std::logic_error(std::string("Socket creation failed: ") + strerror(errno));
- }
- std::memset((char*)&addr, 0, sizeof(addr));
- addr.sin_family = AF_INET;
- addr.sin_addr.s_addr = htonl(INADDR_ANY);
- addr.sin_port = htons(port);
- if (bind(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
- throw std::logic_error(std::string("Socket binding failed: ") + strerror(errno));
- }
- }
- udpsocket::udpsocket(udpsocket&& o) : addr(o.addr),s(o.s){
- o.s = 0;
- }
- udpsocket& udpsocket::operator=(udpsocket&& o){
- addr = o.addr;
- s = o.s;
- o.s = 0;
- return *this;
- }
- void udpsocket::write(const std::string& msg, const std::string& dest, int port){
- std::vector<char> _msg(msg.begin(), msg.end());
- write(_msg, dest, port);
- }
- void udpsocket::write(const std::vector<char>& msg, const std::string& dest, int port){
- struct sockaddr_in _dest;
- std::memset((char*)&_dest, 0, sizeof(sockaddr_in));
- _dest.sin_family = AF_INET;
- _dest.sin_port = htons(PORT);
- if (inet_aton(dest.c_str(), &_dest.sin_addr) == 0) {
- throw std::logic_error(std::string("inet_aton() failed: ") + strerror(errno));
- }
- if (sendto(s, msg.data(), msg.size(), 0, (struct sockaddr*)&dest, slen) < 0) {
- throw std::logic_error(std::string("Could not send packet: ") + strerror(errno));
- }
- }
- std::vector<char> udpsocket::receive(){
- std::vector<char> ret(1024);
- if (read(s, ret.data(), 1024) <= 0) {
- throw std::logic_error(std::string("Could not receive packet: ") + strerror(errno));
- }
- return ret;
- }
- void udpsocket::close(){
- shutdown(s, 2);
- }
- void die(const std::string& s) {
- perror(s.c_str());
- exit(1);
- }
- int main() {
- udpsocket sock(5566);
- sock.write("Hallo", "127.0.0.1",5555);
- std::cin.get();
- return 0;
- }
|