Skip to content
Syscall BSD#98

svc · unix #98

connect

Initie une connexion sur une socket vers l'adresse de pair spécifiée.

Prototype

int connect(int s, caddr_t name, socklen_t namelen);

Retour: int

Arguments

NameTypeDirDescription
sint-
namecaddr_t-
namelensocklen_t-

Historique des versions

XNU tagmacOS#
xnu-1456.1.26macOS 10.6 Snow Leopard98
xnu-1486.2.1198
xnu-1504.15.398
xnu-1504.3.1298
xnu-1504.7.498
xnu-1504.9.1798
xnu-1504.9.2698
xnu-1504.9.3798

Exemples

Non-blocking TCP connect

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
int rc = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
if (rc < 0 && errno != EINPROGRESS) perror("connect");

Notes

Sur AF_INET/AF_INET6, connect() déclenche la recherche de route, l'évaluation de la politique NECP et (pour TCP) l'échange SYN ; l'appel bloque jusqu'à établissement sauf si la socket est non bloquante. macOS transmet le tuple (proc, sockaddr) à necp_socket_find_policy_match, qui peut refuser le flux, le forcer dans un tunnel VPN/proxy ou l'attacher à un canal Skywalk. Les apps sandboxées sans 'network.client' reçoivent EPERM ici avant même qu'un paquet ne soit émis.

Détection

Endpoint Security n'expose aucun événement connect(). handleNewFlow de NEFilterDataProvider avec un NEFilterSocketFlow est le tap pris en charge et fournit (sourceAppIdentifier, remoteEndpoint, protocol). syscall::connect:entry de DTrace ne fonctionne que sur Intel ou avec SIP désactivé.

API associées

socketconnectxbindgetpeernamenecp_client_action