Безопасно ли использовать временный sockaddr_in при использовании connect () в C? - PullRequest
4 голосов
/ 15 ноября 2009

Используя сокеты в C, безопасно ли делать это в функции?

int ConnectTo(char *ip, int port){
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    inet_pton(AF_INET, ip, &addr.sin_addr.s_addr);
    addr.sin_port = htons(port);

    int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(connect(sock, (struct sockaddr *) &addr, sizeof(addr))
        return sock;
    else
        return -1;
}

Более конкретно, прототип, приведенный в 'man connect', является

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

Буду ли я наказан где-нибудь в будущем, если структура sockaddr будет уничтожена позже?

Ответы [ 3 ]

4 голосов
/ 16 ноября 2009

То, что вы делаете, совершенно безопасно - сокет берет копию всего, что ему нужно, из sockaddr.

0 голосов
/ 15 ноября 2009

Причина, по которой sockaddr передается в качестве указателя, заключается в том, что это структура, и они хотят избежать ненужного ее копирования, что могло бы произойти, если бы она была передана в качестве значения. Указатель обычно имеет размер одного слова памяти - в большинстве случаев 32 или 64 бита. Структура sockaddr довольно большая, на моей платформе она не менее 18 байт.

По логике было бы довольно трудно для другой функции, находящейся на линии, получить доступ к этому указателю. Единственный способ, который мог когда-либо случиться, был бы, если бы функция connect () хранила этот указатель глобально где-то, что является абсолютно чокнутым и не имело бы никакого смысла и если когда-либо был API сокетов, который делал это, вы должны либо убить себя, либо разработчика этой реализации.

0 голосов
/ 15 ноября 2009

У меня никогда не было проблем с этим. Структура сокета должна содержать данные sockaddr впоследствии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...