| 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) == -1)
return -1;
if (error != 0) {
errno = error;
return -1;
}
return 0;
}
...
int retcode;
...
for (retcode = connect(s, name, namelen);
retcode == -1 && 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.
| June 20, 2019 | openbsd |