sendto error에 대해서 질문드려요..

emeraldrhapsody의 이미지

지금 리눅스와 윈도우간 udp통신을 하려고 합니다.

sendto를 호출하게 되면 자동으로 bind하는걸로 알고 있었는데..

일단은 bind까지 했는데도 sendto에서 리턴값이 -1이 나옵니다.

  int sock = socket( PF_INET, SOCK_DGRAM, 0 );  
  if ( sock == -1 )
  {
    fprintf( stderr, "socket create FAIL!\n" );
    exit(-1);
  }
 
  struct sockaddr_in server_addr;
  memset( &server_addr, 0, sizeof( server_addr ) );
  server_addr.sin_family = PF_INET;
  server_addr.sin_port = htons( 49001 );
  server_addr.sin_addr.s_addr = htonl( atoi(argv[1]) );
 
  if ( -1 == bind( sock, (struct sockaddr*)&server_addr, sizeof( server_addr ) ) )
  {
    fprintf( stderr, "Bind Error\n" );
    exit(-1);
  }
  char buffer[64+1];
 
  abc(); //buffer채움
 
  int ret = 0;
  ret = sendto( sock, argv[2], strlen( argv[2] )+1, 0, (struct sockaddr*)&server_addr,                   sizeof(server_addr) );
  if ( ret == -1 )
  {
    fprintf( stderr, "sendto() failed.\n" );
  }
gilgil의 이미지

1. PF_INET을 AF_INT으로 바꿔 보세요.

  int sock = socket( PF_INET, SOCK_DGRAM, 0 );  
  server_addr.sin_family = PF_INET;

  int sock = socket( AF_INET, SOCK_DGRAM, 0 );  
  server_addr.sin_family = AF_INET;

2.bind를 할 때에 s_addr 값에는 INADDR_ANY 혹은 자기 자신의 네트워크 어댑터 IP가 들어가야 하고, sendto를 할 때 server_addr정보에 상대방 주소가 들어가 있어야 합니다.

bind 이전

server_addr.sin_addr.s_addr = INADDR_ANY;

sendto 이전

server_addr.sin_addr.s_addr = htonl( atoi(argv[1]) )