Я написал 2 простых класса udp(путём нарезания какого-то кода сервера и клиента).
#include "usefull.h" #include <winsock2.h> #include <Ws2tcpip.h> #pragma comment (lib, "Ws2_32.lib") class IADDR { public: sockaddr_in addr; IADDR() { memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; } IADDR(string ip,int16_t port) { memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; char buff1[100]; InetPton(AF_INET, ip.c_str(), &addr.sin_addr.s_addr); addr.sin_port = htons(port); //addr.sin_addr.s_addr = htonl(addr.sin_addr.s_addr); } }; class UDP { public: UDP() { ok = 0; if (!is_st) { WSADATA w; int res = WSAStartup(MAKEWORD(2, 2), &w); if (res != 0) { return; } is_st = 1; } } ~UDP() { if (ok == 1) { closesocket(sock); ok = 0; } } void set(IADDR a) { if (ok == 1) { closesocket(sock); ok = 0; } if (is_st == 0) return; addr = a; sock = socket(AF_INET, SOCK_DGRAM, 0); u_long nMode = 1; if (ioctlsocket(sock, FIONBIO, &nMode) == SOCKET_ERROR) { closesocket(sock); } ok = 1; } void send(vector<byte> v) { send(&v[0], v.size()); } void send(const byte* buff, uint32_t size) { if (ok == 0) return; int len = sizeof(addr.addr); sendto(sock, (char*)buff, size, 0, (sockaddr*)&addr.addr, len); } bool recv(vector<byte> &data) { if (ok == 0) return 0; data.resize(1024); sockaddr_in serverInfo; int fromlen = sizeof(addr.addr); uint len = recvfrom(sock, (char*)&data[0], 1024, 0, (sockaddr*)&serverInfo, &fromlen); if (len != SOCKET_ERROR) { data.resize(len); return 1; } else { data.resize(0); return 0; } } private: int sock; IADDR addr; int ok; static int is_st; friend class UDPSERVER; }; class UDPSERVER { public: UDPSERVER() { ok = 0; if (!UDP::is_st) { WSADATA w; int res = WSAStartup(MAKEWORD(2, 2), &w); if (res != 0) { return; } UDP::is_st = 1; } } ~UDPSERVER() { if (ok == 1) { closesocket(sock); ok = 0; } } void set(USHORT port) { if (UDP::is_st == 0) return; if (ok == 1) { closesocket(sock); ok = 0; } struct sockaddr_in sv_ip; sv_ip.sin_family = AF_INET; sv_ip.sin_port = htons(port); sv_ip.sin_addr.s_addr = INADDR_ANY; sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { return; } u_long nMode = 1; if (ioctlsocket(sock, FIONBIO, &nMode) == SOCKET_ERROR) { closesocket(sock); return; } if (bind(sock, (sockaddr*)&sv_ip, sizeof(sv_ip)) == SOCKET_ERROR) { closesocket(sock); return; } ok = 1; } void send(vector<byte> v, IADDR &a) { send(&v[0], v.size(), a); } void send(const byte* buff, uint32_t size, IADDR &a) { if (ok == 0) return; int fromlen = sizeof(a.addr); sendto(sock, (char*)buff, size, 0, (sockaddr*)&a.addr, fromlen); } bool recv(vector<byte> &data, IADDR &a) { if (ok == 0) return 0; data.resize(1024); int fromlen = sizeof(a.addr); int len = recvfrom(sock, (char*)&data[0], 1024, 0, (sockaddr*)&a.addr, &fromlen); if (len != SOCKET_ERROR) { data.resize(len); return 1; } else { data.resize(0); return 0; } } private: SOCKET sock; IADDR addr; int ok; }; int UDP::is_st = 0;
В сокетах я ничего не понимаю. Работает вроде правильно но не крашнется ли? И надо бы как-то его на линукс перевести но как? Использование boost не приемлимо!(ибо он 2 часа устанавливается да ещё и не с 1 раза). QT тоже не использовать т.к. у него есть лицензия.
Win компилю VS а линукс QTCreator.
Компилить под линукс даже не пытался т.к. явно под виндовс.