#include "piethernet.h" PIEthernet::PIEthernet(PIString ip, int port, void * data_, EthernetFunc slot): PIThread() { setPriority(piHigh); data = data_; ip_ = ip_s = ip; port_ = port_s = port; sock = sock_s = -1; ret_func = slot; buffer = new char[BUFFER_SIZE]; #ifdef WINDOWS WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); #endif initSend(); } PIEthernet::~PIEthernet() { terminate(); #ifdef WINDOWS WSACleanup(); #endif delete buffer; if (sock != -1) { shutdown(sock, SHUT_RDWR); close(sock); sock = -1; } if (sock_s != -1) { shutdown(sock_s, SHUT_RDWR); close(sock_s); sock_s = -1; } } void PIEthernet::terminate() { if (!initialized()) return; if (isRunning()) { stop(); pthread_cancel(thread); } /*if (sock != -1) { shutdown(sock, SHUT_RDWR); shutdown(sock, SHUT_RDWR); close(sock); sock = -1; } if (sock_s != -1) { shutdown(sock_s, SHUT_RDWR); close(sock_s); sock_s = -1; }*/ } void PIEthernet::begin() { if (!init()) stop(); } void PIEthernet::run() { #ifdef WINDOWS int addr_len; #else socklen_t addr_len; #endif //cout << "[PIEthernet] reading ... "; readed = recvfrom(sock, buffer, BUFFER_SIZE, 0, (sockaddr * )&addr_, &addr_len); //cout << WSAGetLastError() << endl; if (readed < 0) { //cout << "[PIEthernet] Error while reading" << endl; //stop(); //init(); return; } if (ret_func != 0) ret_func(data, buffer); } void PIEthernet::end() { terminate(); } bool PIEthernet::init() { addr_.sin_addr.s_addr = inet_addr(ip_.stdString().data()); addr_.sin_family = PF_INET; addr_.sin_port = htons(port_); close(sock); sock = socket(PF_INET, SOCK_DGRAM, 0); if (bind(sock, (sockaddr * )&addr_, sizeof(addr_)) == -1) { cout << "[PIEthernet] Cant`t bind to " << ip_.stdString() << ":" << port_ << endl; return false; } return true; } bool PIEthernet::initSend() { close(sock_s); sock_s = socket(PF_INET, SOCK_DGRAM, 0); if (sock_s == -1) { cout << "[PIEthernet] Unable to create socket" << endl; return false; } return true; } bool PIEthernet::send(PIString ip, int port, char * data, int size) { if (sock_s == -1) { //cout << "[PIEthernet] Can`t send to uninitialized socket" << endl; return false; } saddr_.sin_port = htons(port); saddr_.sin_addr.s_addr = inet_addr(ip.stdString().data()); saddr_.sin_family = PF_INET; wrote = sendto(sock_s, data, size, 0, (sockaddr * )&saddr_, sizeof(saddr_)); if (wrote != size) { //cout << "[PIEthernet] Error while sending" << endl; return false; } //cout << "[PIEthernet] Wrote " << wrote << " bytes in " << devName << endl; return true; } bool PIEthernet::send(char * data, int size) { if (sock_s == -1) { //cout << "[PIEthernet] Can`t send to uninitialized socket" << endl; return false; } saddr_.sin_port = htons(port_s); saddr_.sin_addr.s_addr = inet_addr(ip_s.stdString().data()); saddr_.sin_family = PF_INET; //cout << "[PIEthernet] sending in " << sock_s << endl; wrote = sendto(sock_s, data, size, 0, (sockaddr * )&saddr_, sizeof(saddr_)); if (wrote != size) { //cout << "[PIEthernet] Error while sending" << endl; return false; } //cout << "[PIEthernet] Wrote " << wrote << " bytes" << endl; return true; }