29.07.2011 - fundamental new

This commit is contained in:
peri4
2011-07-29 08:17:24 +04:00
parent b21a0496cd
commit 29190ea465
49 changed files with 4704 additions and 1052 deletions

View File

@@ -8,7 +8,8 @@ PIEthernet::PIEthernet(PIString ip, int port, void * data_, EthernetFunc slot):
port_ = port_s = port;
sock = sock_s = -1;
ret_func = slot;
buffer = new char[BUFFER_SIZE];
tries = 0;
//buffer_ = new char[BUFFER_SIZE];
#ifdef WINDOWS
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
@@ -22,26 +23,36 @@ PIEthernet::~PIEthernet() {
#ifdef WINDOWS
WSACleanup();
#endif
delete buffer;
if (sock != -1) {
shutdown(sock, SHUT_RDWR);
#ifdef WINDOWS
closesocket(sock);
#else
close(sock);
#endif
sock = -1;
}
if (sock_s != -1) {
shutdown(sock_s, SHUT_RDWR);
#ifdef WINDOWS
closesocket(sock_s);
#else
close(sock_s);
#endif
sock_s = -1;
}
//if (buffer_ != 0) delete buffer_;
//buffer_ = 0;
}
void PIEthernet::terminate() {
if (!initialized()) return;
if (!receiverInitialized()) return;
if (isRunning()) {
stop();
pthread_cancel(thread);
}
tries = 0;
/*if (sock != -1) {
shutdown(sock, SHUT_RDWR);
shutdown(sock, SHUT_RDWR);
@@ -63,20 +74,20 @@ void PIEthernet::begin() {
void PIEthernet::run() {
#ifdef WINDOWS
int addr_len;
int addr_len = sizeof(sockaddr_storage);
#else
socklen_t addr_len;
socklen_t addr_len = sizeof(sockaddr_storage);
#endif
//cout << "[PIEthernet] reading ... ";
readed = recvfrom(sock, buffer, BUFFER_SIZE, 0, (sockaddr * )&addr_, &addr_len);
//cout << "[PIEthernet] reading from " << &addr_ << endl;
readed = recvfrom(sock, buffer_, BUFFER_SIZE, 0, (sockaddr * )&addr_, &addr_len);
//cout << WSAGetLastError() << endl;
if (readed < 0) {
//cout << "[PIEthernet] Error while reading" << endl;
cout << "[PIEthernet] Error while reading, " << errorString() << endl;
//stop();
//init();
return;
}
if (ret_func != 0) ret_func(data, buffer);
if (ret_func != 0) ret_func(data, buffer_, readed);
}
@@ -86,13 +97,23 @@ void PIEthernet::end() {
bool PIEthernet::init() {
addr_.sin_addr.s_addr = inet_addr(ip_.stdString().data());
addr_.sin_addr.s_addr = inet_addr(ip_.data());
addr_.sin_family = PF_INET;
addr_.sin_port = htons(port_);
#ifdef WINDOWS
closesocket(sock);
#else
close(sock);
#endif
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;
if (tries < 10) {
if (init()) {
tries = 0;
return true;
} else return false;
} else
cout << "[PIEthernet] Cant`t bind to " << ip_ << ":" << port_ << ", " << errorString() << endl;
return false;
}
return true;
@@ -100,10 +121,20 @@ bool PIEthernet::init() {
bool PIEthernet::initSend() {
#ifdef WINDOWS
closesocket(sock_s);
#else
close(sock_s);
#endif
sock_s = socket(PF_INET, SOCK_DGRAM, 0);
if (sock_s == -1) {
cout << "[PIEthernet] Unable to create socket" << endl;
if (tries < 10) {
if (init()) {
tries = 0;
return true;
} else return false;
} else
cout << "[PIEthernet] Unable to create socket, " << errorString() << endl;
return false;
}
return true;
@@ -116,7 +147,7 @@ bool PIEthernet::send(PIString ip, int port, char * data, int size) {
return false;
}
saddr_.sin_port = htons(port);
saddr_.sin_addr.s_addr = inet_addr(ip.stdString().data());
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) {
@@ -134,7 +165,7 @@ bool PIEthernet::send(char * data, int size) {
return false;
}
saddr_.sin_port = htons(port_s);
saddr_.sin_addr.s_addr = inet_addr(ip_s.stdString().data());
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_));