Merge "Redesign Inet sender and receiver"
This commit is contained in:
commit
a029b65f78
2 changed files with 81 additions and 27 deletions
101
utils/LocIpc.cpp
101
utils/LocIpc.cpp
|
@ -164,7 +164,8 @@ public:
|
||||||
|
|
||||||
umask(0157);
|
umask(0157);
|
||||||
if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) {
|
if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) {
|
||||||
LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno));
|
LOC_LOGe("bind socket error. sock fd: %d: %s, reason: %s", mSock->mSid,
|
||||||
|
mAddr.sun_path, strerror(errno));
|
||||||
mSock->close();
|
mSock->close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -177,26 +178,22 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class LocIpcInetTcpSender : public LocIpcSender {
|
class LocIpcInetSender : public LocIpcSender {
|
||||||
protected:
|
protected:
|
||||||
|
int mSockType;
|
||||||
shared_ptr<Sock> mSock;
|
shared_ptr<Sock> mSock;
|
||||||
const string mName;
|
const string mName;
|
||||||
sockaddr_in mAddr;
|
sockaddr_in mAddr;
|
||||||
mutable bool mFirstTime;
|
|
||||||
inline virtual bool isOperable() const override { return mSock != nullptr && mSock->isValid(); }
|
inline virtual bool isOperable() const override { return mSock != nullptr && mSock->isValid(); }
|
||||||
inline virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const {
|
virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const {
|
||||||
if (mFirstTime) {
|
|
||||||
mFirstTime = false;
|
|
||||||
::connect(mSock->mSid, (const struct sockaddr*)&mAddr, sizeof(mAddr));
|
|
||||||
}
|
|
||||||
return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr));
|
return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr));
|
||||||
}
|
}
|
||||||
public:
|
public:
|
||||||
inline LocIpcInetTcpSender(const char* name, int32_t port) : LocIpcSender(),
|
inline LocIpcInetSender(const char* name, int32_t port, int sockType) : LocIpcSender(),
|
||||||
mSock(make_shared<Sock>((nullptr == name) ? -1 : (::socket(AF_INET, SOCK_STREAM, 0)))),
|
mSockType(sockType),
|
||||||
|
mSock(make_shared<Sock>((nullptr == name) ? -1 : (::socket(AF_INET, mSockType, 0)))),
|
||||||
mName((nullptr == name) ? "" : name),
|
mName((nullptr == name) ? "" : name),
|
||||||
mAddr({.sin_family=AF_INET, .sin_port=htons(port), .sin_addr={htonl(INADDR_ANY)}}),
|
mAddr({.sin_family=AF_INET, .sin_port=htons(port), .sin_addr={htonl(INADDR_ANY)}}) {
|
||||||
mFirstTime(true) {
|
|
||||||
if (mSock != nullptr && mSock->isValid() && nullptr != name) {
|
if (mSock != nullptr && mSock->isValid() && nullptr != name) {
|
||||||
struct hostent* hp = gethostbyname(name);
|
struct hostent* hp = gethostbyname(name);
|
||||||
if (nullptr != hp) {
|
if (nullptr != hp) {
|
||||||
|
@ -206,7 +203,47 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class LocIpcInetTcpRecver : public LocIpcInetTcpSender, public LocIpcRecver {
|
class LocIpcInetTcpSender : public LocIpcInetSender {
|
||||||
|
protected:
|
||||||
|
mutable bool mFirstTime;
|
||||||
|
|
||||||
|
virtual ssize_t send(const uint8_t data[], uint32_t length, int32_t /* msgId */) const {
|
||||||
|
if (mFirstTime) {
|
||||||
|
mFirstTime = false;
|
||||||
|
::connect(mSock->mSid, (const struct sockaddr*)&mAddr, sizeof(mAddr));
|
||||||
|
}
|
||||||
|
return mSock->send(data, length, 0, (struct sockaddr*)&mAddr, sizeof(mAddr));
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline LocIpcInetTcpSender(const char* name, int32_t port) :
|
||||||
|
LocIpcInetSender(name, port, SOCK_STREAM),
|
||||||
|
mFirstTime(true) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class LocIpcInetRecver : public LocIpcInetSender, public LocIpcRecver {
|
||||||
|
protected:
|
||||||
|
virtual ssize_t recv() const = 0;
|
||||||
|
public:
|
||||||
|
inline LocIpcInetRecver(const shared_ptr<ILocIpcListener>& listener, const char* name,
|
||||||
|
int32_t port, int sockType) :
|
||||||
|
LocIpcInetSender(name, port, sockType), LocIpcRecver(listener, *this) {
|
||||||
|
if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) {
|
||||||
|
LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno));
|
||||||
|
mSock->close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
inline virtual ~LocIpcInetRecver() {}
|
||||||
|
inline virtual const char* getName() const override { return mName.data(); };
|
||||||
|
inline virtual void abort() const override {
|
||||||
|
if (isSendable()) {
|
||||||
|
mSock->sendAbort(0, (struct sockaddr*)&mAddr, sizeof(mAddr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class LocIpcInetTcpRecver : public LocIpcInetRecver {
|
||||||
mutable int32_t mConnFd;
|
mutable int32_t mConnFd;
|
||||||
protected:
|
protected:
|
||||||
inline virtual ssize_t recv() const override {
|
inline virtual ssize_t recv() const override {
|
||||||
|
@ -223,21 +260,26 @@ protected:
|
||||||
public:
|
public:
|
||||||
inline LocIpcInetTcpRecver(const shared_ptr<ILocIpcListener>& listener, const char* name,
|
inline LocIpcInetTcpRecver(const shared_ptr<ILocIpcListener>& listener, const char* name,
|
||||||
int32_t port) :
|
int32_t port) :
|
||||||
LocIpcInetTcpSender(name, port), LocIpcRecver(listener, *this), mConnFd(-1) {
|
LocIpcInetRecver(listener, name, port, SOCK_STREAM), mConnFd(-1) {}
|
||||||
if (mSock->isValid() && ::bind(mSock->mSid, (struct sockaddr*)&mAddr, sizeof(mAddr)) < 0) {
|
inline virtual ~LocIpcInetTcpRecver() { if (-1 != mConnFd) ::close(mConnFd);}
|
||||||
LOC_LOGe("bind socket error. sock fd: %d, reason: %s", mSock->mSid, strerror(errno));
|
|
||||||
mSock->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inline virtual ~LocIpcInetTcpRecver() { if (-1 != mConnFd) ::close(mConnFd); }
|
|
||||||
inline virtual const char* getName() const override { return mName.data(); };
|
|
||||||
inline virtual void abort() const override {
|
|
||||||
if (isSendable()) {
|
|
||||||
mSock->sendAbort(0, (struct sockaddr*)&mAddr, sizeof(mAddr));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class LocIpcInetUdpRecver : public LocIpcInetRecver {
|
||||||
|
protected:
|
||||||
|
inline virtual ssize_t recv() const override {
|
||||||
|
socklen_t size = sizeof(mAddr);
|
||||||
|
return mSock->recv(mDataCb, 0, (struct sockaddr*)&mAddr, &size);
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
inline LocIpcInetUdpRecver(const shared_ptr<ILocIpcListener>& listener, const char* name,
|
||||||
|
int32_t port) :
|
||||||
|
LocIpcInetRecver(listener, name, port, SOCK_DGRAM) {}
|
||||||
|
|
||||||
|
inline virtual ~LocIpcInetUdpRecver() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NOT_DEFINED
|
#ifdef NOT_DEFINED
|
||||||
class LocIpcQcsiSender : public LocIpcSender {
|
class LocIpcQcsiSender : public LocIpcSender {
|
||||||
protected:
|
protected:
|
||||||
|
@ -368,6 +410,13 @@ unique_ptr<LocIpcRecver> LocIpc::getLocIpcInetTcpRecver(const shared_ptr<ILocIpc
|
||||||
const char* serverName, int32_t port) {
|
const char* serverName, int32_t port) {
|
||||||
return make_unique<LocIpcInetTcpRecver>(listener, serverName, port);
|
return make_unique<LocIpcInetTcpRecver>(listener, serverName, port);
|
||||||
}
|
}
|
||||||
|
shared_ptr<LocIpcSender> LocIpc::getLocIpcInetUdpSender(const char* serverName, int32_t port) {
|
||||||
|
return make_shared<LocIpcInetSender>(serverName, port, SOCK_DGRAM);
|
||||||
|
}
|
||||||
|
unique_ptr<LocIpcRecver> LocIpc::getLocIpcInetUdpRecver(const shared_ptr<ILocIpcListener>& listener,
|
||||||
|
const char* serverName, int32_t port) {
|
||||||
|
return make_unique<LocIpcInetUdpRecver>(listener, serverName, port);
|
||||||
|
}
|
||||||
pair<shared_ptr<LocIpcSender>, unique_ptr<LocIpcRecver>>
|
pair<shared_ptr<LocIpcSender>, unique_ptr<LocIpcRecver>>
|
||||||
LocIpc::getLocIpcQmiLocServiceSenderRecverPair(const shared_ptr<ILocIpcListener>& listener, int instance) {
|
LocIpc::getLocIpcQmiLocServiceSenderRecverPair(const shared_ptr<ILocIpcListener>& listener, int instance) {
|
||||||
typedef pair<shared_ptr<LocIpcSender>, unique_ptr<LocIpcRecver>> (*creator_t)(const shared_ptr<ILocIpcListener>&, int);
|
typedef pair<shared_ptr<LocIpcSender>, unique_ptr<LocIpcRecver>> (*creator_t)(const shared_ptr<ILocIpcListener>&, int);
|
||||||
|
|
|
@ -66,6 +66,8 @@ public:
|
||||||
|
|
||||||
static shared_ptr<LocIpcSender>
|
static shared_ptr<LocIpcSender>
|
||||||
getLocIpcLocalSender(const char* localSockName);
|
getLocIpcLocalSender(const char* localSockName);
|
||||||
|
static shared_ptr<LocIpcSender>
|
||||||
|
getLocIpcInetUdpSender(const char* serverName, int32_t port);
|
||||||
static shared_ptr<LocIpcSender>
|
static shared_ptr<LocIpcSender>
|
||||||
getLocIpcInetTcpSender(const char* serverName, int32_t port);
|
getLocIpcInetTcpSender(const char* serverName, int32_t port);
|
||||||
static shared_ptr<LocIpcSender>
|
static shared_ptr<LocIpcSender>
|
||||||
|
@ -74,6 +76,9 @@ public:
|
||||||
static unique_ptr<LocIpcRecver>
|
static unique_ptr<LocIpcRecver>
|
||||||
getLocIpcLocalRecver(const shared_ptr<ILocIpcListener>& listener,
|
getLocIpcLocalRecver(const shared_ptr<ILocIpcListener>& listener,
|
||||||
const char* localSockName);
|
const char* localSockName);
|
||||||
|
static unique_ptr<LocIpcRecver>
|
||||||
|
getLocIpcInetUdpRecver(const shared_ptr<ILocIpcListener>& listener,
|
||||||
|
const char* serverName, int32_t port);
|
||||||
static unique_ptr<LocIpcRecver>
|
static unique_ptr<LocIpcRecver>
|
||||||
getLocIpcInetTcpRecver(const shared_ptr<ILocIpcListener>& listener,
|
getLocIpcInetTcpRecver(const shared_ptr<ILocIpcListener>& listener,
|
||||||
const char* serverName, int32_t port);
|
const char* serverName, int32_t port);
|
||||||
|
|
Loading…
Reference in a new issue