programing

socket connect() vs bind()

itsource 2022. 8. 3. 00:25
반응형

socket connect() vs bind()

다.connect() ★★★★★★★★★★★★★★★★★」bind()시스템은 소켓파일 기술자를 주소(일반적으로 IP/포트의 조합)로 호출합니다.은 다음과

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

그리고.

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

두통통 확확 ?확 ??? ???하면 좋을까요?connect() 리리 and and and and and andbind()

일부 는 「」를 사용하고 을 알 수 있습니다.connect()가 사용 입니다.bind()전화했어요 이유를 확실히 알 수 없었어요

이해를 높이기 위해 정확히 어디에서 결속되고 연결되는지 알아보겠습니다.

Sourav에서 설명한 바와 같이 2개의 콜의 배치에 더하여

bind()는 소켓을 로컬주소와 관련짓습니다(그 때문에 서버측이 바인드 되어 클라이언트가 그 주소를 사용하여 서버에 접속할 수 있습니다).connect()는 리모트[서버]주소에 접속하기 위해서 사용됩니다.그 때문에, 클라이언트측의 connect [as:connect to server]가 사용됩니다.

특정 역할과 그에 따른 구현으로 인해 클라이언트/서버가 같은 머신에 있는 경우에도 이러한 기능을 서로 바꾸어 사용할 수 없습니다.

이러한 콜의 TCP/IP 핸드쉐이크를 관련짓는 것을 한층 더 추천합니다.

여기에 이미지 설명 입력

여기서 SYN을 송신하는 것은 connect()가 됩니다.바인드()는 통신 엔드 포인트의 정의에 사용됩니다.

이게 도움이 됐으면 좋겠어!!

의 라이너 1개의 라이너: bind() 주소, 주소, 주소, 주소,connect()리모트 주소로 송신합니다.

의 man 페이지에서 인용합니다.

bind()는 addr에 의해 지정된 주소를 파일 기술자 sockfd에 의해 참조되는 소켓에 할당합니다.addrlen은 addr이 가리키는 주소 구조의 크기(바이트)를 지정합니다.전통적으로 이 작업을 "소켓에 이름 할당"이라고 합니다.

그리고 마찬가지로

connect() 시스템콜은 파일 기술자 sockfd에 의해 참조되는 소켓을 addr에 의해 지정된 주소에 연결합니다.

명확히 하자면,

  • bind()를 연관짓습니다).bind클라이언트는 이 주소를 사용하여 서버에 접속할 수 있습니다.]
  • connect()는 리모트 [서버]주소에 접속하기 위해서 사용됩니다.as:connect to server ]접속하다

이 될 것 요.connect() ★★★★★★★★★★★★★★★★★」listen()connect() ★★★★★★★★★★★★★★★★★」bind() 생략할 수 bind()쪽인가 하면, 그 은 별로 좋지 connect(), 그 이 좋습니다.listen().

클라이언트의 은, 「」입니다.listen()이고, 또 전자의 특징입니다.connect()★★★★★★ 。bind()어느 쪽에서도 찾을 수 있거나 찾을 수 없습니다.

서버와 클라이언트가 다른 머신에 있다고 가정하면 다양한 기능을 이해하기 쉬워집니다.

bind()는 로컬로 동작합니다.즉, 호출된 머신의 접속 끝을 요청된 주소로 바인드하고 요청된 포트를 사용자에게 할당합니다.이것은, 그 머신이 클라이언트인지 서버인지에 관계없이 행해집니다. connect().timeout, client.timeout, connected, connected, connected, connected, connected, connected, 주소 및 하는 것을 .는 거의 '오빠'를 호출했을 입니다.bind()★★★★★★★★★★★★★★★★★★전listen() 및 알수 , 「접속처 주소 및 포토」를 합니다.connect().

bind()connect() (클라이언트)listen()그것은 가지 .하지만 그것은 둘 다 부작용이지 그들의 목적이 아니다.덧없음

여기서 중요한 점은 클라이언트를 바인드할 필요가 없다는 것입니다.클라이언트는 서버에 접속하기 때문에 서버는 특정 포트에 바인드하지 않고 ephemeral 포트를 사용하더라도 클라이언트의 주소와 포트를 인식할 수 있기 때문입니다.는 「」, 「」, 「」, 「」, 「」, 「」를 호출할 수 만,listen()하지 않고bind()이 시나리오에서는 할당된 ephemeral 포트를 검출하고 그 포트를 접속하는 임의의 클라이언트에 전달해야 합니다.

입니다.connect()에 UDP .UDP 에서는 를 호출하지 .UDP를 사용합니다.bind() 번째가 되기 sendto()(UDP) connection-less) ion)) ( ( ( 。할 수 가 '부르다'입니다.recvfrom()할당된 포트와 바인드주소가 없으면 수신처가 없기 때문에(바인딩의 부재를 어떻게 해석하느냐에 따라서는, 너무 많은 것을 수신할 수 없기 때문에, 에러가 반환됩니다).

bind는 실행 중인 프로세스에 포트를 할당하도록 지시합니다.즉, 포트 80에 바인드하여 인코밍 요구를 수신해야 합니다.bind를 사용하면 프로세스가 서버가 됩니다.connect를 사용하는 경우 이미 사용 중인 포트에 연결하도록 프로세스에 지시합니다.프로세스가 클라이언트가 됩니다.차이는 중요합니다.바인드는 사용하지 않는 포트(그 포트를 클레임하여 서버가 될 수 있도록), connect는 이미 사용 중인 포트(접속하여 서버와 통신할 수 있도록)를 원합니다.

Wikipedia http://en.wikipedia.org/wiki/Berkeley_sockets#bind.28.29 에서

connect():

connect() 시스템콜은 파일 기술자에 의해 식별되는 소켓을 인수 목록에 있는 호스트의 주소로 지정된 리모트호스트에 접속합니다.

특정 유형의 소켓은 커넥션이 없으며 가장 일반적으로 사용자 데이터그램 프로토콜 소켓입니다.이러한 소켓에서 connect는 특별한 의미를 가집니다.데이터 송수신 기본 타깃이 지정된 주소로 설정되어 있기 때문에 connectionless 소켓에서 send() 및 recv() 등의 기능을 사용할 수 있습니다.

connect()는 오류 코드를 나타내는 정수를 반환합니다.0은 성공을 나타내고 -1은 오류를 나타냅니다.

bind():

bind()는 소켓을 주소에 할당합니다.소켓()을 사용하여 소켓을 생성하면 프로토콜 패밀리만 지정되고 주소는 할당되지 않습니다.소켓이 다른 호스트와의 접속을 받아들이기 전에 bind() 시스템콜로 이 주소와의 관련성을 실행해야 합니다.bind()는 다음 3개의 인수를 사용합니다.

sockfd: 바인드를 실행하는 소켓을 나타내는 기술자.my_addr: 바인드할 주소를 나타내는 sockaddr 구조체로의 포인터.addr.addr.의 크기를 지정하는 socklen_t 필드.Bind()는 성공 시 0을 반환하고 오류가 발생하면 -1을 반환합니다.

예: 1.접속 사용

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

int main(){
  int clientSocket;
  char buffer[1024];
  struct sockaddr_in serverAddr;
  socklen_t addr_size;

  /*---- Create the socket. The three arguments are: ----*/
  /* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
  clientSocket = socket(PF_INET, SOCK_STREAM, 0);

  /*---- Configure settings of the server address struct ----*/
  /* Address family = Internet */
  serverAddr.sin_family = AF_INET;
  /* Set port number, using htons function to use proper byte order */
  serverAddr.sin_port = htons(7891);
  /* Set the IP address to desired host to connect to */
  serverAddr.sin_addr.s_addr = inet_addr("192.168.1.17");
  /* Set all bits of the padding field to 0 */
  memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);  

  /*---- Connect the socket to the server using the address struct ----*/
  addr_size = sizeof serverAddr;
  connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);

  /*---- Read the message from the server into the buffer ----*/
  recv(clientSocket, buffer, 1024, 0);

  /*---- Print the received message ----*/
  printf("Data received: %s",buffer);   

  return 0;
}

2) 바인딩 예시:

int main()
{
    struct sockaddr_in source, destination = {};  //two sockets declared as previously
    int sock = 0;
    int datalen = 0;
    int pkt = 0;

    uint8_t *send_buffer, *recv_buffer;

    struct sockaddr_storage fromAddr;   // same as the previous entity struct sockaddr_storage serverStorage;
    unsigned int addrlen;  //in the previous example socklen_t addr_size;
    struct timeval tv;
    tv.tv_sec = 3;  /* 3 Seconds Time-out */
    tv.tv_usec = 0;

    /* creating the socket */         
    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 
        printf("Failed to create socket\n");

    /*set the socket options*/
    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));

    /*Inititalize source to zero*/
    memset(&source, 0, sizeof(source));       //source is an instance of sockaddr_in. Initialization to zero
    /*Inititalize destinaton to zero*/
    memset(&destination, 0, sizeof(destination));


    /*---- Configure settings of the source address struct, WHERE THE PACKET IS COMING FROM ----*/
    /* Address family = Internet */
    source.sin_family = AF_INET;    
    /* Set IP address to localhost */   
    source.sin_addr.s_addr = INADDR_ANY;  //INADDR_ANY = 0.0.0.0
    /* Set port number, using htons function to use proper byte order */
    source.sin_port = htons(7005); 
    /* Set all bits of the padding field to 0 */
    memset(source.sin_zero, '\0', sizeof source.sin_zero); //optional


    /*bind socket to the source WHERE THE PACKET IS COMING FROM*/
    if (bind(sock, (struct sockaddr *) &source, sizeof(source)) < 0) 
        printf("Failed to bind socket");

    /* setting the destination, i.e our OWN IP ADDRESS AND PORT */
    destination.sin_family = AF_INET;                 
    destination.sin_addr.s_addr = inet_addr("127.0.0.1");  
    destination.sin_port = htons(7005); 

    //Creating a Buffer;
    send_buffer=(uint8_t *) malloc(350);
    recv_buffer=(uint8_t *) malloc(250);

    addrlen=sizeof(fromAddr);

    memset((void *) recv_buffer, 0, 250);
    memset((void *) send_buffer, 0, 350);

    sendto(sock, send_buffer, 20, 0,(struct sockaddr *) &destination, sizeof(destination));

    pkt=recvfrom(sock, recv_buffer, 98,0,(struct sockaddr *)&destination, &addrlen);
    if(pkt > 0)
        printf("%u bytes received\n", pkt);
    }

그 차이가 명확해졌으면 좋겠다.

선언하는 소켓타입은 필요한 소켓에 따라 달라집니다.이것은 매우 중요합니다.

:쪽이 설정되어 가 다릅니다.차이는, 송신원(로컬) 또는 행선지 주소/포트 중 어느 쪽이 설정되어 있는지를 나타냅니다.로 말하면, 요,,,bind()과 「」를 합니다.connect()행선지를 설정합니다.TCP 'UDP' 'UDP'

bind()

bind()소켓의 로컬(소스) 주소를 설정합니다.이치노소켓에 의해 송신되는 패킷은, 이것을 송신원주소로서 전송하기 때문에, 다른 호스트는 패킷을 송신하는 장소를 알 수 있습니다.

수신할 필요가 없는 경우, 소켓 송신원주소는 사용할 수 없습니다.TCP와 같은 프로토콜은 하나 이상의 패킷이 도착했을 때 대상 호스트가 확인을 다시 보내기 위해 수신을 활성화해야 합니다(예: 확인).

connect()

  • TCP の tcp tcp tcp tcp 。 connect()TCP 코드가 상대측으로의 접속 확립을 시도하도록 트리거 합니다.
  • UDP "connected" (접속 완료) connect()는 주소가 지정되지 않은 경우에만 패킷이 전송되는 기본 주소를 설정합니다.connect() 미사용입니다.sendto() ★★★★★★★★★★★★★★★★★」sendmsg()는, 행선지 주소를 격납해 사용할 필요가 있습니다.

connect()또는 송신 함수가 호출되어 주소가 바인드되지 않은 경우 Linux는 소켓을 랜덤포트에 자동으로 바인드합니다.기술적인 상세한 것에 대하여는, Linux 커널의 소스 코드를 참조하십시오.

사이드 노트

  • listen()【TCP】
  • AF_INET 패밀리에서는, 소켓의 송신원주소 또는 행선지 주소(struct sockaddr_in는, IP 주소(IP 헤더 참조)와 TCP 또는 UDP 포토(TCP UDP 헤더 참조)로 구성됩니다.

언급URL : https://stackoverflow.com/questions/27014955/socket-connect-vs-bind

반응형