#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 sock = socket(PF_INET, SOCK_DGRAM, 0); sock_s = socket(PF_INET, SOCK_DGRAM, 0); if (sock == -1 || sock_s == -1) cout << "[PIEthernet] Unable to create socket" << endl; } PIEthernet::~PIEthernet() { if (isRunning()) { stop(); pthread_cancel(thread); } if (sock != -1) { shutdown(sock, SHUT_RDWR); close(sock); } if (sock_s != -1) { shutdown(sock_s, SHUT_RDWR); close(sock_s); } #ifdef WINDOWS WSACleanup(); #endif delete buffer; } 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() { 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; } //cout << "[PIEthernet] end" << endl; } bool PIEthernet::init() { addr_.sin_addr.s_addr = inet_addr(ip_.data()); addr_.sin_family = PF_INET; addr_.sin_port = htons(port_); if (bind(sock, (sockaddr * )&addr_, sizeof(addr_)) == -1) { cout << "[PIEthernet] Cant`t bind to " << ip_ << ":" << port_ << 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.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.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; }