C를 사용하여 C를 미리 정의 된 포트에 사용하여 TCP 소켓을 만드는 방법

StackOverflow https://stackoverflow.com/questions/204169

  •  03-07-2019
  •  | 
  •  

문제

나는 아주 간단한 질문이 있습니다. 특정 포트가 현재 사용 중인지 여부를 테스트하고 싶습니다. 이를 위해서는 TCP 소켓을 포트에 바인딩하고 싶습니다. 연결이 거부되면 포트가 사용 중이며 포트가 자유롭지 않다는 것을 의미합니다.

누군가 C로 TCP 소켓 코드를 어떻게 작성할 수 있습니까? 나는 Solaris 플랫폼에 있습니다.

나는 그것의 매우 기본적인 것을 알고 있습니다. 하지만 당신의 도움에 감사드립니다. 미리 감사드립니다.

도움이 되었습니까?

해결책

오류가 있으면 함수를 바인딩하는 호출은 -1을 반환합니다. 여기에는 주소가 이미 사용중인 경우가 포함됩니다.

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 12345

int main()
{
  struct sockaddr_in addr;
  int fd;

  fd = socket(AF_INET, SOCK_STREAM, 0);
  if(fd == -1)
  {
      printf("Error opening socket\n");
      return -1;
  }

  addr.sin_port = htons(PORT);
  addr.sin_addr.s_addr = 0;
  addr.sin_addr.s_addr = INADDR_ANY;
  addr.sin_family = AF_INET;

  if(bind(fd, (struct sockaddr *)&addr,sizeof(struct sockaddr_in) ) == -1)
  {
      printf("Error binding socket\n");
      return -1;
  }

  printf("Successfully bound to port %u\n", PORT);
}

다른 팁

테스트하려는 내용에 약간 의존합니다.

사용 bind() Joelc가 제안한 방식으로 포트가 열려 있는지 알려줄 것입니다. 어느 컴퓨터의 인터페이스. 철저하게 되더라도 반품 값을 확인해야합니다. bind(), 또한 확인 errno == EADDRINUSE.

즉. (Joelc 코드 수정)


if(bind(socket, (struct sockaddr *)&sin,sizeof(struct sockaddr_in) ) == -1)
{
    if( errno == EADDRINUSE )
    {
        // handle port already open case
    }
    else
    {
        // handle other errors
    }
}

라인에 사용 된 주소를 변경하여 : 예 :


    sin.sin_addr.s_addr = inet_addr("192.168.1.1");

... 특정 인터페이스에서 포트를 사용할 수 있는지 테스트 할 수 있습니다.

그러나 이것은 포트 상태에 대한 완벽한 테스트는 아닙니다. 다른 프로세스가 포트가 열려 있고 항구를 우아하게 닫기 전에 종료 된 경우 (즉, 전화하기 전에 close() 소켓에서) 그런 다음 보통 동일하게됩니다. EADDRINUSE 오류. (소켓에서 SO_Reuseaddr 옵션이 설정되었는지 여부에 따라

(사이드 참고 : 테스트 응용 프로그램이 충분한 권한으로 실행되지 않는 한 1024 미만의 포트에 ()를 바인딩 할 수 없습니다)

익명으로 제안했듯이, 당신은 또한 netstat. 이것은 반복적으로 전화하여 얻을 수있는 것과 동일한 정보를 모두 줄 것입니다. bind() 부작용이 훨씬 빠르고 부작용없이 (실제로 포트에 바인딩 할 필요가 없으므로 다른 프로세스를 사용할 수 없습니다). 그냥 전화 netstat -a --numeric-ports -t 그리고 출력을 분석하면 당신이 후에 모든 것을 줄 수 있습니다.

그러나 Moogs 제안에 대한 의견 - 각 포트에서 Telnet을 호출하면 소켓이 해당 포트에서 듣는 경우에만 실제로 열려 있는지 여부가 아닌 경우에만 알려줍니다.

특정 포트가 현재 사용 중인지 테스트하고 싶습니까? (실제로 프로그램을 만들 필요는 없습니다). 그렇다면 Telnet을 사용할 수 있습니다.

텔넷 호스트 포트

연결이 실패하면 사용되지 않습니다. 그것이 당신의 입력을 연결하고 기다리는 경우, 그것은 사용 중입니다 :)

Netstat의 소스 코드를보고 싶을 수도 있습니다. Solaris에도 Netstat도 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top