git-svn-id: svn://db.shs.com.ru/pip@750 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2019-02-11 10:04:47 +00:00
parent fc8d1c253b
commit dccb5cc7ea
3 changed files with 22 additions and 18 deletions

View File

@@ -213,6 +213,7 @@ inline PIByteArray & operator >>(PIByteArray & s, PIByteArray & v) {assert(s.siz
//! \relatesalso PIByteArray \brief Restore operator, see \ref PIByteArray_sec1 for details //! \relatesalso PIByteArray \brief Restore operator, see \ref PIByteArray_sec1 for details
inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) {assert(s.size_s() >= v.s); if (v.s > 0) memcpy((void*)(v.d), s.data(), v.s); s.remove(0, v.s); return s;} inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) {assert(s.size_s() >= v.s); if (v.s > 0) memcpy((void*)(v.d), s.data(), v.s); s.remove(0, v.s); return s;}
#undef PBA_OPERATOR_FROM
template<typename Type0, typename Type1> inline PIByteArray & operator <<(PIByteArray & s, const PIPair<Type0, Type1> & v); template<typename Type0, typename Type1> inline PIByteArray & operator <<(PIByteArray & s, const PIPair<Type0, Type1> & v);
//! \relatesalso PIByteArray \brief Store operator //! \relatesalso PIByteArray \brief Store operator

View File

@@ -288,9 +288,9 @@ bool PIEthernet::init() {
pr = IPPROTO_TCP; pr = IPPROTO_TCP;
} }
PIFlags<Parameters> params = parameters(); PIFlags<Parameters> params = parameters();
sock = socket(AF_INET, st, pr); sock = ::socket(AF_INET, st, pr);
if (params[SeparateSockets]) if (params[SeparateSockets])
sock_s = socket(AF_INET, st, pr); sock_s = ::socket(AF_INET, st, pr);
else else
sock_s = sock; sock_s = sock;
if (sock == -1 || sock_s == -1) { if (sock == -1 || sock_s == -1) {
@@ -741,6 +741,7 @@ int PIEthernet::readDevice(void * read_to, int max_size) {
return -1; return -1;
} }
if (connected_) { if (connected_) {
piCoutObj << "Disconnect on read," << ethErrorString();
init(); init();
connected_ = false; connected_ = false;
disconnected(rs < 0); disconnected(rs < 0);
@@ -837,11 +838,11 @@ int PIEthernet::writeDevice(const void * data, int max_size) {
if (!connected_) return -1; if (!connected_) return -1;
ret = ::send(sock, (const char *)data, max_size, 0); ret = ::send(sock, (const char *)data, max_size, 0);
if (ret < 0) { if (ret < 0) {
connected_ = false; { connected_ = false;
piCoutObj << "Disconnect on write," << ethErrorString();
init(); init();
disconnected(true); disconnected(true);
} }
}
return ret; return ret;
default: break; default: break;
//return ::read(sock, read_to, max_size); //return ::read(sock, read_to, max_size);
@@ -1097,7 +1098,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
# endif*/ # endif*/
# ifdef ANDROID # ifdef ANDROID
struct ifconf ifc; struct ifconf ifc;
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); int s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
ifc.ifc_len = 256; ifc.ifc_len = 256;
ifc.ifc_buf = new char[ifc.ifc_len]; ifc.ifc_buf = new char[ifc.ifc_len];
if (ioctl(s, SIOCGIFCONF, &ifc) < 0) { if (ioctl(s, SIOCGIFCONF, &ifc) < 0) {
@@ -1125,7 +1126,7 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
delete ifc.ifc_buf; delete ifc.ifc_buf;
# else # else
struct ifaddrs * ret; struct ifaddrs * ret;
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); int s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (getifaddrs(&ret) == 0) { if (getifaddrs(&ret) == 0) {
while (ret != 0) { while (ret != 0) {
if (ret->ifa_addr == 0) { if (ret->ifa_addr == 0) {
@@ -1209,7 +1210,7 @@ PIEthernet::Address PIEthernet::interfaceAddress(const PIString & interface_) {
struct ifreq ifr; struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr)); memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, interface_.dataAscii()); strcpy(ifr.ifr_name, interface_.dataAscii());
int s = socket(AF_INET, SOCK_DGRAM, 0); int s = ::socket(AF_INET, SOCK_DGRAM, 0);
ioctl(s, SIOCGIFADDR, &ifr); ioctl(s, SIOCGIFADDR, &ifr);
::close(s); ::close(s);
struct sockaddr_in * sa = (struct sockaddr_in * )&ifr.ifr_addr; struct sockaddr_in * sa = (struct sockaddr_in * )&ifr.ifr_addr;

View File

@@ -316,6 +316,8 @@ public:
virtual bool canWrite() const {return mode() & WriteOnly;} virtual bool canWrite() const {return mode() & WriteOnly;}
int socket() const {return sock;}
EVENT1(newConnection, PIEthernet * , client) EVENT1(newConnection, PIEthernet * , client)
EVENT0(connected) EVENT0(connected)
EVENT1(disconnected, bool, withError) EVENT1(disconnected, bool, withError)
@@ -500,15 +502,15 @@ private:
static void server_func(void * eth); static void server_func(void * eth);
void setType(Type t, bool reopen = true) {setProperty(PIStringAscii("type"), (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}} void setType(Type t, bool reopen = true) {setProperty(PIStringAscii("type"), (int)t); if (reopen && isOpened()) {closeDevice(); init(); openDevice();}}
inline static int ethErrorCore(); static int ethErrorCore();
inline static PIString ethErrorString(); static PIString ethErrorString();
inline static int ethRecv(int sock, void * buf, int size, int flags = 0); static int ethRecv(int sock, void * buf, int size, int flags = 0);
inline static int ethRecvfrom(int sock, void * buf, int size, int flags, sockaddr * addr); static int ethRecvfrom(int sock, void * buf, int size, int flags, sockaddr * addr);
inline static int ethSendto(int sock, const void * buf, int size, int flags, sockaddr * addr, int addr_len); static int ethSendto(int sock, const void * buf, int size, int flags, sockaddr * addr, int addr_len);
inline static void ethClosesocket(int sock, bool shutdown); static void ethClosesocket(int sock, bool shutdown);
inline static int ethSetsockopt(int sock, int level, int optname, const void * optval, int optlen); static int ethSetsockopt(int sock, int level, int optname, const void * optval, int optlen);
inline static int ethSetsockoptInt(int sock, int level, int optname, int value = 1); static int ethSetsockoptInt(int sock, int level, int optname, int value = 1);
inline static int ethSetsockoptBool(int sock, int level, int optname, bool value = true); static int ethSetsockoptBool(int sock, int level, int optname, bool value = true);
}; };