37rpx::XvcServer::XvcServer(uint16_t port,
int wakeFd,
JtagDriver* drv,
unsigned maxMsgSize)
41 maxMsgSize_(maxMsgSize),
43 struct sockaddr_in a{};
46 a.sin_family = AF_INET;
47 a.sin_addr.s_addr = INADDR_ANY;
48 a.sin_port = htons(port);
50 if ((sd_ = ::socket(AF_INET, SOCK_STREAM, 0)) < 0)
53 if (::setsockopt(sd_, SOL_SOCKET, SO_REUSEADDR, &yes,
sizeof(yes))) {
59 if (::bind(sd_,
reinterpret_cast<struct sockaddr*
>(&a),
sizeof(a))) {
67 socklen_t len =
sizeof(a);
68 if (::getsockname(sd_,
reinterpret_cast<struct sockaddr*
>(&a), &len) < 0) {
73 port_ = ntohs(a.sin_port);
76 if (::listen(sd_, 1)) {
92 if (sd_ < 0 || sd_ >= FD_SETSIZE || (wakeFd_ >= 0 && wakeFd_ >= FD_SETSIZE)) {
93 int badFd = (sd_ < 0 || sd_ >= FD_SETSIZE) ? sd_ : wakeFd_;
99 if (wakeFd_ >= 0 && wakeFd_ >= sd_) maxFd = wakeFd_ + 1;
101 while (threadEn.load(std::memory_order_acquire)) {
104 if (wakeFd_ >= 0) FD_SET(wakeFd_, &rset);
114 nready = ::select(maxFd, &rset,
nullptr,
nullptr,
nullptr);
117 if (errno == EINTR)
continue;
118 int savedErrno = errno;
119 log->warning(
"XvcServer::run(): select() failed: %s (errno %d)", strerror(savedErrno), savedErrno);
121 strerror(savedErrno), savedErrno));
123 if (wakeFd_ >= 0 && FD_ISSET(wakeFd_, &rset)) {
127 if (FD_ISSET(sd_, &rset)) {
134 log->debug(
"Sub-connection closed: %s", e.
what());