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>
18
19
20
21 \fBint\fR \fBconnect\fR(\fBint\fR \fIs\fR, \fBconst struct sockaddr *\fR\fIname\fR, \fBint\fR \fInamelen\fR);
22 .fi
23
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>
92
93 int
94 main(int argc, char *argv[])
95 {
96 char *eptr;
97 long port;
98 int sock, ret, eport;
99 struct sockaddr_in6 sin6;
100
101 if (argc != 3) {
102 fprintf(stderr, "connect: <IP> <port>\\n");
103 return (1);
104 }
105
106 bzero(&sin6, sizeof (struct sockaddr_in6));
107 sin6.sin6_family = AF_INET6;
108
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 }
130
131 errno = 0;
132 port = strtol(argv[2], &eptr, 10);
133 if (errno != 0 || *eptr != '\e0') {
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);
142
143 sock = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0);
144 if (sock < 0) {
145 perror("socket");
146 return (1);
147 }
148
149 eport = port_create();
150 if (eport < 0) {
151 perror("port_create");
152 (void) close(sock);
153 return (1);
154 }
155
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 }
164
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 }
199
200 /* Read and write to the socket and then clean up */
201
202 return (0);
203 }
204 .fi
205 .in -2
206 .SH RETURN VALUES
207 .LP
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
211 .LP
212 The call fails if:
213 .sp
214 .ne 2
215 .na
216 \fB\fBEACCES\fR\fR
217 .ad
218 .RS 17n
219 Search permission is denied for a component of the path prefix of the pathname
220 in \fIname\fR.
221 .RE
222
223 .sp
224 .ne 2
225 .na
226 \fB\fBEADDRINUSE\fR\fR
227 .ad
228 .RS 17n
229 The address is already in use.
230 .RE
231
232 .sp
233 .ne 2
234 .na
235 \fB\fBEADDRNOTAVAIL\fR\fR
236 .ad
237 .RS 17n
238 The specified address is not available on the remote machine.
239 .RE
240
241 .sp
242 .ne 2
243 .na
244 \fB\fBEAFNOSUPPORT\fR\fR
245 .ad
246 .RS 17n
247 Addresses in the specified address family cannot be used with this socket.
248 .RE
249
250 .sp
251 .ne 2
252 .na
253 \fB\fBEALREADY\fR\fR
254 .ad
255 .RS 17n
256 The socket is non-blocking, and a previous connection attempt has not yet been
257 completed.
258 .RE
259
260 .sp
261 .ne 2
262 .na
263 \fB\fBEBADF\fR\fR
264 .ad
265 .RS 17n
266 \fIs\fR is not a valid descriptor.
267 .RE
268
269 .sp
270 .ne 2
271 .na
272 \fB\fBECONNREFUSED\fR\fR
273 .ad
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.
278 .RE
279
280 .sp
281 .ne 2
282 .na
283 \fB\fBEINPROGRESS\fR\fR
284 .ad
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.
288 .RE
289
290 .sp
291 .ne 2
292 .na
293 \fB\fBEINTR\fR\fR
294 .ad
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.
298 .RE
299
300 .sp
301 .ne 2
302 .na
303 \fB\fBEINVAL\fR\fR
304 .ad
305 .RS 17n
306 \fInamelen\fR is not the size of a valid address for the specified address
307 family.
308 .RE
309
310 .sp
311 .ne 2
312 .na
313 \fB\fBEIO\fR\fR
314 .ad
315 .RS 17n
316 An I/O error occurred while reading from or writing to the file system.
317 .RE
318
319 .sp
320 .ne 2
321 .na
322 \fB\fBEISCONN\fR\fR
323 .ad
324 .RS 17n
325 The socket is already connected.
326 .RE
327
328 .sp
329 .ne 2
330 .na
331 \fB\fBELOOP\fR\fR
332 .ad
333 .RS 17n
334 Too many symbolic links were encountered in translating the pathname in
335 \fIname\fR.
336 .RE
337
338 .sp
339 .ne 2
340 .na
341 \fB\fBENETUNREACH\fR\fR
342 .ad
343 .RS 17n
344 The network is not reachable from this host.
345 .RE
346
347 .sp
348 .ne 2
349 .na
350 \fB\fBEHOSTUNREACH\fR\fR
351 .ad
352 .RS 17n
353 The remote host is not reachable from this host.
354 .RE
355
356 .sp
357 .ne 2
358 .na
359 \fB\fBENOENT\fR\fR
360 .ad
361 .RS 17n
362 A component of the path prefix of the pathname in \fIname\fR does not exist.
363 .RE
364
365 .sp
366 .ne 2
367 .na
368 \fB\fBENOENT\fR\fR
369 .ad
370 .RS 17n
371 The socket referred to by the pathname in \fIname\fR does not exist.
372 .RE
373
374 .sp
375 .ne 2
376 .na
377 \fB\fBENOSR\fR\fR
378 .ad
379 .RS 17n
380 There were insufficient \fBSTREAMS\fR resources available to complete the
381 operation.
382 .RE
383
384 .sp
385 .ne 2
386 .na
387 \fB\fBENXIO\fR\fR
388 .ad
389 .RS 17n
390 The server exited before the connection was complete.
391 .RE
392
393 .sp
394 .ne 2
395 .na
396 \fB\fBETIMEDOUT\fR\fR
397 .ad
398 .RS 17n
399 Connection establishment timed out without establishing a connection.
400 .RE
401
402 .sp
403 .ne 2
404 .na
405 \fB\fBEWOULDBLOCK\fR\fR
406 .ad
407 .RS 17n
408 The socket is marked as non-blocking, and the requested operation would block.
409 .RE
410
411 .sp
412 .LP
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.
415 .sp
416 .ne 2
417 .na
418 \fB\fBENOTDIR\fR\fR
419 .ad
420 .RS 14n
421 A component of the path prefix of the pathname in \fIname\fR is not a
422 directory.
423 .RE
424
425 .sp
426 .ne 2
427 .na
428 \fB\fBENOTSOCK\fR\fR
429 .ad
430 .RS 14n
431 \fIs\fR is not a socket.
432 .RE
433
434 .sp
435 .ne 2
436 .na
437 \fB\fBENOTSOCK\fR\fR
438 .ad
439 .RS 14n
440 \fIname\fR is not a socket.
441 .RE
442
443 .sp
444 .ne 2
445 .na
446 \fB\fBEPROTOTYPE\fR\fR
447 .ad
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.
452 .RE
453
454 .SH ATTRIBUTES
455 .LP
456 See \fBattributes\fR(5) for descriptions of the following attributes:
457 .sp
458
459 .sp
460 .TS
461 box;
462 c | c
463 l | l .
464 ATTRIBUTE TYPE ATTRIBUTE VALUE
465 _
466 MT-Level Safe
467 .TE
468
469 .SH SEE ALSO
470 .LP
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)