31 while(waitpid(-1,
nullptr, WNOHANG) > 0) {}
39int TcpAcceptor::open(
const Contact& address)
41 yCDebug(TCPACCEPTOR_POSIX,
"TCP/IP start in server mode");
42 set_handle(socket(AF_INET, SOCK_STREAM, 0));
43 if (get_handle() < 0) {
44 yCError(TCPACCEPTOR_POSIX,
"At TcpAcceptor::open there was an error: %d, %s", errno, strerror(errno));
49 if (setsockopt(get_handle(), SOL_SOCKET, SO_REUSEADDR, &yes,
51 yCError(TCPACCEPTOR_POSIX,
"At TcpAcceptor::open there was an error: %d, %s", errno, strerror(errno));
55 return shared_open(address);
61int TcpAcceptor::shared_open(
const Contact& address)
63 struct sockaddr_in servAddr;
64 servAddr.sin_addr.s_addr = INADDR_ANY;
65 servAddr.sin_family = AF_INET;
66 servAddr.sin_port = htons((address.
getPort()>0)?address.
getPort():0);
67 inet_pton(AF_INET, address.
getHost().c_str(), &servAddr.sin_addr);
68 memset(servAddr.sin_zero,
'\0',
sizeof servAddr.sin_zero);
70 if (bind(get_handle(), (
struct sockaddr *)&servAddr,
sizeof (
struct sockaddr)) < 0) {
71 yCError(TCPACCEPTOR_POSIX,
"At bind(sockfd) there was an error: %d, %s", errno, strerror(errno));
75 if (listen(get_handle(),
BACKLOG) < 0) {
76 yCError(TCPACCEPTOR_POSIX,
"At listen(sockfd) there was an error: %d, %s", errno, strerror(errno));
82 sigemptyset(&sa.sa_mask);
83 sa.sa_flags = SA_RESTART;
84 if (sigaction(SIGCHLD, &sa,
nullptr) < 0) {
85 yCError(TCPACCEPTOR_POSIX,
"At sigaction(address) there was an error: %d, %s", errno, strerror(errno));
89 struct sockaddr_in sin;
90 socklen_t addrlen =
sizeof(sin);
91 if (getsockname(get_handle(), (
struct sockaddr *)&sin, &addrlen) == 0 &&
92 sin.sin_family == AF_INET &&
93 addrlen ==
sizeof(sin)) {
94 port_number =
static_cast<int>(ntohs(sin.sin_port));
96 yCError(TCPACCEPTOR_POSIX,
"At getsockname(address) there was an error: %d, %s", errno, strerror(errno));
109 sockaddr* addr =
nullptr;
113 new_stream.
set_handle(::accept(get_handle(),
reinterpret_cast<struct sockaddr*
>(&addr),
reinterpret_cast<socklen_t*
>(len_ptr)));
115 yCError(TCPACCEPTOR_POSIX,
"At accept(sockfd) there was an error: %d, %s", errno, strerror(errno));
122int TcpAcceptor::close()
126 if (get_handle() != -1) {
127 result = ::close(get_handle());
void sigchld_handler(int)
An error handler that reaps the zombies.
#define yCError(component,...)
#define yCDebug(component,...)
#define YARP_OS_LOG_COMPONENT(name, name_string)
The components from which ports and connections are built.
An interface to the operating system, including Port based communication.