본문 바로가기

Network/초급 TCP/IP socket

09. UDP에 connect() 사용

TCP소켓의 흐름에서 connect()를 사용하여 지정된 주소로 연결을 시도합니다 전화를 걸기위해 번호를 누르는것과 비슷한데 원형은 이렇습니다

int connect(int socket, const struct sockaddr *foreignAddress, socklen_t addressLength)

소켓을 통해 앞으로 전송 할 데이터그램의 목적지 주소를 고정하기 위해서 UDP소켓상에서 connect()을 사용하는 것이 가능합니다 연결이 되면 목적지를 저장할 필요가 없기 때문에 sendto() 대신 send()를 이용하면 됩니다 연결이 이루어진 지정한 주소로만 데이터의 송수신이 가능합니다 

 



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char * message);

int main()
{
  int sock;
  char message[30];
  int str_len;
  
  struct sockaddr_in serv_addr;
  
  sock =  socket(PF_INET, SOCK_DGRAM, 0);

  memset(&serv_addr, 0sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  serv_addr.sin_port =  htons(9190);
  
  connect(sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr));

  while(1)
  {
    fputs("전송할 메시지를 입력하세요(q to quit) : ", stdout);
    fgets(message, sizeof(message), stdin);

    if( !strcmp(message,"q\n")) break;
  
    write(sock, message, strlen(message));
    
    str_len = read(sock,message,sizeof(message)-1);
    message[str_len] = 0;
    printf("서버로 부터 수신된 메세지  : %s \n",message);
  }

  close(sock);
  return 0;
}


결과>>



위 프로그램은 server를 동작시키지 않고도 message[]에 입력된 데이터를 출력하기 때문에 server에서 보내온 메세지를 확인 할수 없습니다
server에서 보내오는 메세지를 저장할  message2[]를 선언하여 서버로 부터 보내온 메세지를 저장하고 출력합니다

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char * message);

int main()
{
  int sock;
  char message[30];
  char message1[30];
  int str_len;
  
  struct sockaddr_in serv_addr;
  
  sock =  socket(PF_INET, SOCK_DGRAM, 0);

  memset(&serv_addr, 0sizeof(serv_addr));
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  serv_addr.sin_port =  htons(9190);
  
  connect(sock,(struct sockaddr*)&serv_addr, sizeof(serv_addr));

  while(1)
  {
    fputs("전송할 메시지를 입력하세요(q to quit) : ", stdout);
    fgets(message, sizeof(message), stdin);

    if( !strcmp(message,"q\n")) break;
  
    write(sock, message, strlen(message));
    
    str_len = read(sock,message1,sizeof(message)-1);
    message1[str_len] = 0;
    printf("서버로 부터 수신된 메세지  : %s \n",message1);
  }

  close(sock);
  return 0;
}



결과>>


sever를 실행하지 않고 client만 실행했을 경우 "서버로 부터 수신된 메세지"에 아무것도 출력되지 않은 것을 알수있습니다