728x90

데이터 경계가 존재하는 UDP 소켓

- 데이터 수신을 딜레이를 주고 받아도 한번에 보낸 데이터는 한번에 읽힘

// 송신측
int main()
{
    ...
    sendto(sock, msg1, sizeof(msg1), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
    sendto(sock, msg2, sizeof(msg2), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
    sendto(sock, msg3, sizeof(msg3), 0, (struct sockaddr*)&your_adr, sizeof(your_adr));
}   
// 수신 측
int main()
{
    ...
    for(i=0; i<3; i++)
    {
        sleep(5);	// delay 5 sec.
        adr_sz=sizeof(your_adr);
        str_len=recvfrom(sock, message, BUF_SIZE, 0, (struct sockaddr*)&your_adr, &adr_sz);     
        
        printf("Message %d: %s \n", i+1, message);
    } 
}

connected UDP 소켓

- UDP 소켓은 기본적으로 연결의 개념이 없음

- 데이터를 전송할 때(sendto)의 단계

    -> UDP 소켓에 목적지의 IP와 PORT 번호 등록

    -> 데이터 전송

    -> UDP 소켓에 등록된 목적지 정보 삭제

- 하지만 connected UDP 소켓의 경우 1단계, 3단계를 거치지 않음

- UDP에서의 connect는 TCP처럼 상대방과의 연결은 아니지만 소켓에 목적지 정보를 등록

- 등록되었기 때문에 sendto, recvfrom이 아닌 write, read 함수를 통해 데이터를 송수신 가능

int main()
{
    sock=socket(PF_INET, SOCK_DGRAM, 0);   
    if(sock==-1) {
        printf("socket() error");
    }
    
    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family=AF_INET;
    serv_adr.sin_addr.s_addr=inet_addr(INADDR_ANY);
    serv_adr.sin_port=htons("8080");
    
    connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr));
    
    while(1)
    {
        fputs("Insert message(q to quit): ", stdout);
        fgets(message, sizeof(message), stdin);     
        if(!strcmp(message,"q\n") || !strcmp(message,"Q\n"))	
            break;
        
        write(sock, message, strlen(message));
        str_len=read(sock, message, sizeof(message)-1);
        
        message[str_len]=0;
        printf("Message from server: %s", message);
    }	
}

 

728x90

+ Recent posts