2009-11-15 3 views
4

C에서 소켓을 사용하면 함수에서이 작업을 수행하는 것이 안전할까요?C에서 connect()를 사용할 때 임시 sockaddr_in을 사용하는 것이 안전합니까?

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; 
} 

보다 구체적으로, 프로토 타입은 SOCKADDR 구조가 나중에 휴지통 경우

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

가 나는 어딘가에 선을 아래로 처벌 할 것인가 '연결 사람'에 주어진?

답변

4

당신이하고있는 일은 완전히 안전합니다. 소켓은 sockaddr에서 필요한 것의 복사본을 가져옵니다.

+0

정확히 내가 뭘 찾고 있었는지, 고마워! – Asuah

0

그런 식으로 문제를 일으킨 적이 한번도 없었습니다. 소켓 구조는 나중에 sockaddr 데이터를 보유해야합니다.

0

sockaddr이 포인터로 전달되는 이유는 구조체이기 때문에 sockaddr이 불필요하게 복사되지 않으므로 값으로 전달 된 경우 발생합니다. 포인터는 대개 단일 메모리 단어만큼 큰 - 대부분의 경우 32 또는 64 비트입니다. sockaddr 구조체는 꽤 크고 플랫폼에 적어도 18 바이트가 큽니다.

논리적으로는 다른 함수가 해당 포인터에 액세스하는 것이 매우 어려울 것입니다. connect() 함수가 해당 포인터를 전 세계적으로 어딘가에 저장하고 어떤 것도 만들지 않는 경우 감각 그리고 만약 소켓 API가 있다면 그 구현의 자신이나 개발자를 죽여야한다.

+0

이 함수는 일단 스택에서 꺼내지면 구조체의 메모리가 공정한 게임이므로 (소켓을 닫을 때 자유롭게하기 때문에) sockaddr 구조를 보존해야합니다. 완전히 논리적 인 것처럼 보였습니다. 소켓이 연결 후 오랫동안 구조를 계속 사용하는지 여부가 궁금했습니다. 메모리가 파손되면 파손으로 이어질 수 있습니다. – Asuah

+0

아니요, 그 내용을 유지할 필요가 없습니다. connect() 함수는 sockaddr이 반환되면 반환됩니다. 회신에서 connect()를 제대로 구현하지 않으면 해당 메모리에 다시 액세스하려고 시도합니다 ... –

관련 문제