2013-10-15 2 views
-1

안녕하세요 포트 번호를 사용할 수 있는지 확인하는 쉬운 방법이 있다면 궁금하네요 그래서 내가 미리 사용할 수 있도록 그것을 예약? 아래 코드는 그 일을하는 데 효과가 있지만 복잡한 것 같습니다. 포트 Numner을 예약쉬운 방법으로 C에서 포트 번호를 예약

int getSocketNo(){ 
socklen_t namelen; 
struct sockaddr_in node; 
int sock_1; 

/* ----Address information for use with bind---- */ 
node.sin_family = AF_INET;   /* it is an IP address */ 
node.sin_port = 0; 
node.sin_addr.s_addr = INADDR_ANY; /* use any interface on this host*/ 

/* ----Create TCP/IP socket---- */ 
sock_1 = socket(AF_INET, SOCK_STREAM, 0); 
if (sock_1 == -1) { 
    perror("socket() Socket was not created"); 
    exit(-1); 
} 

while(1){ 
    /* ----Bind socket to address and port---- */ 
    if (bind(sock_1, (struct sockaddr *) &node, sizeof(node))) { 
     perror("Server bind error"); 
     continue; 
    } 

    int y = 1; // not sure what this does yet 
    setsockopt(sock_1, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(y)); 

    /* ----Find out what port number was assigned---- */ 
    namelen = sizeof(node); 
    if (getsockname(sock_1, (struct sockaddr *) &node, &namelen)) { 
     perror("Server get port number"); 
     exit(-1); 
    } 
    close(sock_1); 
    break; 
} 

return ntohs(node.sin_port); 

}

답변

1

당신이 바로 소켓을 닫는 제외하고 모든 일을하고 . 그것을 닫지 마십시오 : 소켓을 반환하십시오. 그렇지 않으면 다른 타이밍 윈도우를 열어 포트를 다른 작업으로 가져갈 수 있습니다.

루핑은 bind()이 실패하는 동안 무의미합니다. 모든 것이 정말로 무의미합니다. 제로 포트를 지정하면 포트 공간이 고갈되지 않는 한 시스템 할당 포트를 얻게됩니다. 필요한 소켓을 만들 때이 작업을 수행해야합니다 ().다른 소켓을 만들면 포트를 '예약'하려고하지 않습니다. 포트를 예약하는 방법은 필요한 소켓을 만드는 것입니다.

1

:

당신은 손 전에 프로그램/앱 포트 번호를 예약 할 수 없습니다. bind() 당신이 원하는 것을합니다. 포트 번호에 대해 bind를 호출 한 프로세스의 포트 번호를 예약합니다.


포트 번호를 사용할 수있는 경우 검사 :

지금까지의 포트 번호를 사용할 수있는 경우 검사로, 대답은 다시 bind()입니다. If the port number is not available, bind will fail. 이것은 포트가 다른 프로세스에 의해 사용되고 있음을 의미합니다. 더 많은 정보를 위해 새 포트 번호

를 결합하십시오 :Linux Man


쉬운 예제 코드 :

int main() 
{ 
int sockFd, bytesRead = 1, bytesSent; 

char buffer[MaxBufferLength]; 

struct sockaddr_in server, client; 


server.sin_port= htons(PORT); 
server.sin_family = AF_INET; 
server.sin_addr.s_addr = htonl(INADDR_ANY); 

sockFd = socket(AF_INET, SOCK_STREAM, 0); 


if(sockFd < 0) 
    printf("Unable to open socket\n"); 


int i = bind(sockFd, (struct sockaddr *)&server, sizeof(struct sockaddr)); 

if(i < 0) 
    perror("Unable to bind\n"); 



i = listen(sockFd, 1); 

if(i < 0) 
    printf("Unable to listen\n"); 


int len = sizeof(struct sockaddr); 

int connectionSocket = accept(sockFd, (struct sockaddr *) &client, &len); 

if(connectionSocket < 0) 
    perror("connection not established\n"); 


    // from this point onwards, send & receive data. 
관련 문제