CONNECT(2) | System Calls Manual | CONNECT(2) |
connect
— initiate
a connection on a socket
#include
<sys/socket.h>
int
connect
(int
s, const struct sockaddr
*name, socklen_t
namelen);
The parameter s is a socket. If it is of
type SOCK_DGRAM
, this call specifies the peer with
which the socket is to be associated; this address is that to which
datagrams are to be sent, and the only address from which datagrams are to
be received. If the socket is of type SOCK_STREAM
,
this call attempts to make a connection to another socket. The other socket
is specified by name, which is an address in the
communications space of the socket. namelen indicates
the amount of space pointed to by name, in bytes; the
sa_len member of name is
ignored. Each communications space interprets the name
parameter in its own way. Generally, stream sockets may use
connect
()
only once; datagram sockets may use connect
()
multiple times to change their association. Datagram sockets may dissolve
the association by connecting to an invalid address, such as a null
address.
If the socket is in non-blocking mode and the
connection cannot be completed immediately, or if it is interrupted by a
signal,
connect
()
will return an error and the connection attempt will proceed asynchronously.
Subsequent calls to connect
() will fail with errno
set to EALREADY
. It is possible to use
select(2) or
poll(2) to determine when the
connect operation has completed by checking the socket for writability. The
success or failure of the connection attempt may be determined by using
getsockopt(2) to check
the socket error status with the SO_ERROR
option at
the SOL_SOCKET
level. If the connection was
successful, the error value will be zero. Otherwise, it will be one of the
error values listed below.
If the connection or binding succeeds, 0 is returned. Otherwise a -1 is returned, and a more specific error code is stored in errno.
The following code connects to the host described by
name and handles the case where
connect
() is interrupted by a signal.
#include <sys/socket.h> #include <poll.h> #include <errno.h> #include <err.h> int connect_wait(int s) { struct pollfd pfd[1]; int error = 0; socklen_t len = sizeof(error); pfd[0].fd = s; pfd[0].events = POLLOUT; if (poll(pfd, 1, -1) == -1) return -1; if (getsockopt(s, SOL_SOCKET, SO_ERROR, &error, &len) < 0) return -1; if (error != 0) { errno = error; return -1; } return 0; } ... int retcode; ... for (retcode = connect(s, name, namelen); retcode != 0 && errno == EINTR; retcode = connect_wait(s)) continue; if (retcode == -1) err(1, "connect");
The connect
() call fails if:
EBADF
]ENOTSOCK
]EADDRNOTAVAIL
]EAFNOSUPPORT
]EISCONN
]ETIMEDOUT
]EINVAL
]ECONNREFUSED
]EHOSTUNREACH
]EINTR
]ENETUNREACH
]EADDRINUSE
]EFAULT
]EINPROGRESS
]EALREADY
]connect
() was interrupted by a signal, and the
connection attempt has not yet been completed.EPERM
]The following errors are specific to connecting names in the UNIX-domain. These errors may not apply in future versions of the UNIX IPC domain.
ENOTDIR
]ENAMETOOLONG
]NAME_MAX
characters, or an entire pathname (including the terminating NUL) exceeded
PATH_MAX
bytes.ENOENT
]EACCES
]EACCES
]ELOOP
]EPROTOTYPE
]SOCK_STREAM
whereas name may
refer to a socket of type SOCK_DGRAM
.accept(2), getsockname(2), getsockopt(2), poll(2), select(2), socket(2)
The connect
() function conforms to
IEEE Std 1003.1-2008 (“POSIX.1”).
The connect
() system call first appeared
in 4.1cBSD.
October 5, 2017 | OpenBSD-6.4 |