5373 connect(3SOCKET) could talk about non-blocking mode
[unleashed.git] / usr / src / man / man3socket / connect.3socket
blob7da31cd712ca550024fac0dd9cdb6c17acbd0527
1 '\" te
2 .\" Copyright (C) 2005, Sun Microsystems, Inc.
3 .\" All Rights Reserved
4 .\" Copyright (c) 2014, Joyent, Inc.
5 .\" Copyright 1989 AT&T  All Rights Reserved
6 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License").  You may not use this file except in compliance with the License.
7 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing.  See the License for the specific language governing permissions and limitations under the License.
8 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE.  If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
9 .TH CONNECT 3SOCKET "Nov 25, 2014"
10 .SH NAME
11 connect \- initiate a connection on a socket
12 .SH SYNOPSIS
13 .LP
14 .nf
15 \fBcc\fR [ \fIflag\fR ... ] \fIfile\fR ... \fB-lsocket\fR \fB -lnsl \fR [ \fIlibrary\fR ... ]
16 #include <sys/types.h>
17 #include <sys/socket.h>
21 \fBint\fR \fBconnect\fR(\fBint\fR \fIs\fR, \fBconst struct sockaddr *\fR\fIname\fR, \fBint\fR \fInamelen\fR);
22 .fi
24 .SH DESCRIPTION
25 .LP
26 The parameter \fIs\fR is a socket. If it is of type \fBSOCK_DGRAM\fR,
27 \fBconnect()\fR specifies the peer with which the socket is to be associated.
28 This address is the address to which datagrams are to be sent if a receiver is
29 not explicitly designated. This address is the only address from which
30 datagrams are to be received. If the socket \fIs\fR is of type
31 \fBSOCK_STREAM\fR, \fBconnect()\fR attempts to make a connection to another
32 socket. The other socket is specified by \fIname\fR. \fIname\fR is an address
33 in the communication space of the socket. Each communication space interprets
34 the \fIname\fR parameter in its own way. If \fIs\fR is not bound, then \fIs\fR
35 will be bound to an address selected by the underlying transport provider.
36 Generally, stream sockets can successfully \fBconnect()\fR only once. Datagram
37 sockets can use \fBconnect()\fR multiple times to change their association.
38 Datagram sockets can dissolve the association by connecting to a null address.
39 .SS Non-blocking Sockets
40 When a socket is created, it is by default a \fBblocking\fR socket. A socket may
41 be configured to be \fBnon-blocking\fR either at socket creation time or through
42 the use of \fBfcntl\fR(2). When a socket is set to be \fBnon-blocking\fR, a call
43 to connect initiates an asynchronous connection. If the connection cannot be
44 completed without blocking, such as when making a TCP connection to a remote
45 server, then  the connection attempt is made in the background and \fBconnect\fR
46 returns -1 and errno is set to \fBEINPROGRESS\fR.
47 .LP
48 Applications can obtain the state of this connection attempt by polling the
49 socket's file descriptor for \fBPOLLOUT\fR. The event ports facility is the
50 preferred means of polling on the file descriptor, see \fBport_create\fR(3C) and
51 \fBport_get\fR(3C) for more information on event ports; however, applications
52 may also use traditional portable routines like \fBpoll\fR(2) and
53 \fBselect\fR(3C).
54 .LP
55 When an asynchronous connection has completed, the application must call
56 \fBgetsockopt\fR(3SOCKET) using the macro \fBSOL_SOCKET\fR as the \fIlevel\fR
57 argument and the macro \fBSO_ERROR\fR as the value of the \fIoption\fR argument.
58 If the value of the \fBSO_ERROR\fR socket option is zero, then the
59 connect was successfully established. Otherwise, the connection could not be
60 established and the value is the corresponding error code that would be commonly
61 found in \fBerrno\fR.
62 .LP
63 Even when a socket is in \fBnon-blocking\fR mode, a call to \fBconnect\fR may
64 fail synchronously. If any error other \fBEINPROGRESS\fR or \fBEINTR\fR occurs,
65 then there is no need for the application to poll for asynchronous completion.
66 Similarly, if a call to \fBconnect\fR returns successfully, then the socket
67 connection will be established and there is no need to poll for completion.
68 .SH EXAMPLES
69 .LP
70 \fBExample 1\fR  Performing an asynchronous connection
71 .sp
72 .LP
73 The following sample C program shows how to create and connect to a remote host
74 using TCP. The program should be compiled and linked against libnsl and
75 libsocket. For example, if the contents of this example where in a file called
76 example.c, one would run cc example.c -lnsl -lsocket.
77 .sp
78 .in +2
79 .nf
80 #include <sys/types.h>
81 #include <sys/socket.h>
82 #include <netinet/in.h>
83 #include <arpa/inet.h>
84 #include <inttypes.h>
85 #include <stdio.h>
86 #include <strings.h>
87 #include <stdlib.h>
88 #include <errno.h>
89 #include <port.h>
90 #include <unistd.h>
91 #include <assert.h>
93 int
94 main(int argc, char *argv[])
96         char *eptr;
97         long port;
98         int sock, ret, eport;
99         struct sockaddr_in6 sin6;
101         if (argc != 3) {
102                 fprintf(stderr, "connect: <IP> <port>\\n");
103                 return (1);
104         }
106         bzero(&sin6, sizeof (struct sockaddr_in6));
107         sin6.sin6_family = AF_INET6;
109         /*
110          * Try to parse as an IPv6 address and then try v4.
111          */
112         ret = inet_pton(AF_INET6, argv[1], &sin6.sin6_addr);
113         if (ret == -1) {
114                 perror("inet_pton");
115                 return (1);
116         } else if (ret == 0) {
117                 struct in_addr v4;
118                 ret = inet_pton(AF_INET, argv[1], &v4);
119                 if (ret == -1) {
120                         perror("inet_pton");
121                         return (1);
122                 } else if (ret == 0) {
123                         fprintf(stderr, "connect: %s is not a valid "
124                             "IPv4 or IPv6 address\\n", argv[1]);
125                         return (1);
126                 }
127                 /* N.B. Not a portable macro */
128                 IN6_INADDR_TO_V4MAPPED(&v4, &sin6.sin6_addr);
129         }
131         errno = 0;
132         port = strtol(argv[2], &eptr, 10);
133         if (errno != 0 || *eptr != '\0') {
134                 fprintf(stderr, "failed to parse port %s\\n", argv[2]);
135                 return (1);
136         }
137         if (port <= 0 || port > UINT16_MAX) {
138                 fprintf(stderr, "invalid port: %ld\\n", port);
139                 return (1);
140         }
141         sin6.sin6_port = htons(port);
143         sock = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0);
144         if (sock < 0) {
145                 perror("socket");
146                 return (1);
147         }
149         eport = port_create();
150         if (eport < 0) {
151                 perror("port_create");
152                 (void) close(sock);
153                 return (1);
154         }
156         ret = connect(sock, (struct sockaddr *)&sin6,
157             sizeof (struct sockaddr_in6));
158         if (ret != 0 && errno != EINPROGRESS && errno != EINTR) {
159                 perror("connect");
160                 (void) close(sock);
161                 (void) close(eport);
162                 return (1);
163         }
165         if (ret != 0) {
166                 port_event_t pe;
167                 int err;
168                 socklen_t sz = sizeof (err);
169                 if (port_associate(eport, PORT_SOURCE_FD, sock, POLLOUT,
170                     NULL) != 0) {
171                         perror("port_associate");
172                         (void) close(sock);
173                         (void) close(eport);
174                         return (1);
175                 }
176                 if (port_get(eport, &pe, NULL) != 0) {
177                         perror("port_get");
178                         (void) close(sock);
179                         (void) close(eport);
180                         return (1);
181                 }
182                 assert(pe.portev_source == PORT_SOURCE_FD);
183                 assert(pe.portev_object == (uintptr_t)sock);
184                 if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &sz) != 0) {
185                         perror("getsockopt");
186                         (void) close(sock);
187                         (void) close(eport);
188                         return (1);
189                 }
190                 if (err != 0) {
191                         /* Asynch connect failed */
192                         fprintf(stderr, "asnchronous connect: %s\\n",
193                             strerror(err));
194                         (void) close(sock);
195                         (void) close(eport);
196                         return (1);
197                 }
198         }
200         /* Read and write to the socket and then clean up */
202         return (0);
205 .in -2
206 .SH RETURN VALUES
208 If the connection or binding succeeds, \fB0\fR is returned. Otherwise,
209 \fB\(mi1\fR is returned and sets \fBerrno\fR to indicate the error.
210 .SH ERRORS
212 The call fails if:
214 .ne 2
216 \fB\fBEACCES\fR\fR
218 .RS 17n
219 Search permission is denied for a component of the path prefix of the pathname
220 in \fIname\fR.
224 .ne 2
226 \fB\fBEADDRINUSE\fR\fR
228 .RS 17n
229 The address is already in use.
233 .ne 2
235 \fB\fBEADDRNOTAVAIL\fR\fR
237 .RS 17n
238 The specified address is not available on the remote machine.
242 .ne 2
244 \fB\fBEAFNOSUPPORT\fR\fR
246 .RS 17n
247 Addresses in the specified address family cannot be used with this socket.
251 .ne 2
253 \fB\fBEALREADY\fR\fR
255 .RS 17n
256 The socket is non-blocking,  and a previous connection attempt has not yet been
257 completed.
261 .ne 2
263 \fB\fBEBADF\fR\fR
265 .RS 17n
266 \fIs\fR is not a valid descriptor.
270 .ne 2
272 \fB\fBECONNREFUSED\fR\fR
274 .RS 17n
275 The attempt to connect was forcefully rejected. The calling program should
276 \fBclose\fR(2) the socket descriptor, and issue another \fBsocket\fR(3SOCKET)
277 call to obtain a new descriptor before attempting another \fBconnect()\fR call.
281 .ne 2
283 \fB\fBEINPROGRESS\fR\fR
285 .RS 17n
286 The socket is non-blocking, and the connection cannot be completed immediately.
287 See the section on \fBNon-blocking Sockets\fR for more information.
291 .ne 2
293 \fB\fBEINTR\fR\fR
295 .RS 17n
296 The connection attempt was interrupted before any data arrived by the delivery
297 of a signal. The connection, however, will be established asynchronously.
301 .ne 2
303 \fB\fBEINVAL\fR\fR
305 .RS 17n
306 \fInamelen\fR is not the size of a valid address for the specified address
307 family.
311 .ne 2
313 \fB\fBEIO\fR\fR
315 .RS 17n
316 An I/O error occurred while reading from or writing to the file system.
320 .ne 2
322 \fB\fBEISCONN\fR\fR
324 .RS 17n
325 The socket is already connected.
329 .ne 2
331 \fB\fBELOOP\fR\fR
333 .RS 17n
334 Too many symbolic links were encountered in translating the pathname in
335 \fIname\fR.
339 .ne 2
341 \fB\fBENETUNREACH\fR\fR
343 .RS 17n
344 The network is not reachable from this host.
348 .ne 2
350 \fB\fBEHOSTUNREACH\fR\fR
352 .RS 17n
353 The remote host is not reachable from this host.
357 .ne 2
359 \fB\fBENOENT\fR\fR
361 .RS 17n
362 A component of the path prefix of the pathname in \fIname\fR does not exist.
366 .ne 2
368 \fB\fBENOENT\fR\fR
370 .RS 17n
371 The socket referred to by the pathname in \fIname\fR does not exist.
375 .ne 2
377 \fB\fBENOSR\fR\fR
379 .RS 17n
380 There were insufficient \fBSTREAMS\fR resources available to complete the
381 operation.
385 .ne 2
387 \fB\fBENXIO\fR\fR
389 .RS 17n
390 The server exited before the connection was complete.
394 .ne 2
396 \fB\fBETIMEDOUT\fR\fR
398 .RS 17n
399 Connection establishment timed out without establishing a connection.
403 .ne 2
405 \fB\fBEWOULDBLOCK\fR\fR
407 .RS 17n
408 The socket is marked as non-blocking, and the requested operation would block.
413 The following errors are specific to connecting names in the UNIX domain.
414 These errors might not apply in future versions of the UNIX  \fBIPC\fR domain.
416 .ne 2
418 \fB\fBENOTDIR\fR\fR
420 .RS 14n
421 A component of the path prefix of the pathname in \fIname\fR is not a
422 directory.
426 .ne 2
428 \fB\fBENOTSOCK\fR\fR
430 .RS 14n
431 \fIs\fR is not a socket.
435 .ne 2
437 \fB\fBENOTSOCK\fR\fR
439 .RS 14n
440 \fIname\fR is not a socket.
444 .ne 2
446 \fB\fBEPROTOTYPE\fR\fR
448 .RS 14n
449 The file that is referred to by \fIname\fR is a socket of a type other than
450 type \fIs\fR. For example, \fIs\fR is a \fBSOCK_DGRAM\fR socket, while
451 \fIname\fR refers to a \fBSOCK_STREAM\fR socket.
454 .SH ATTRIBUTES
456 See \fBattributes\fR(5) for descriptions of the following attributes:
461 box;
462 c | c
463 l | l .
464 ATTRIBUTE TYPE  ATTRIBUTE VALUE
466 MT-Level        Safe
469 .SH SEE ALSO
471 \fBclose\fR(2), \fBaccept\fR(3SOCKET), \fBgetsockname\fR(3SOCKET),
472 \fBselect\fR(3C), \fBsocket\fR(3SOCKET), \fBsockaddr\fR(3SOCKET),
473 \fBsocket.h\fR(3HEAD), \fBattributes\fR(5)