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
| Name | Type | Dir | Description |
|---|---|---|---|
| s | int | - | |
| name | caddr_t | - | |
| namelen | socklen_t | - |
Historique des versions
| XNU tag | macOS | # |
|---|---|---|
| xnu-1456.1.26 | macOS 10.6 Snow Leopard | 98 |
| xnu-1486.2.11 | — | 98 |
| xnu-1504.15.3 | — | 98 |
| xnu-1504.3.12 | — | 98 |
| xnu-1504.7.4 | — | 98 |
| xnu-1504.9.17 | — | 98 |
| xnu-1504.9.26 | — | 98 |
| xnu-1504.9.37 | — | 98 |
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é.