|
@@ -1,5 +1,87 @@
|
|
|
|
+#include <arpa/inet.h>
|
|
#include <iostream>
|
|
#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>
|
|
|
|
|
|
-int main(){
|
|
|
|
|
|
+#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;
|
|
}
|
|
}
|