2012-04-27 8 views
0
static void app(const char *address, int port, char *name) 
{ 
    int sock; 
    struct addrinfo server; 

    sock = init_connection(address,port,&server); 
    char buffer[BUF_SIZE]; 

    write_server(sock, &server, name); /*error is here*/ 

    /* ..... */ 
} 

接続機能のsendto():UDPでの不正なファイルディスクリプタ - IPv6の

static int init_connection(const char *address, int port, struct addrinfo *server) 
{ 
    int sockfd; 

    struct addrinfo hints; 

    hints.ai_family = AF_UNSPEC; /*ipv4 or ipv6 */ 
    hints.ai_socktype = SOCK_DGRAM; /* UDP mode */ 
    hints.ai_flags = 0; 
    hints.ai_protocol = IPPROTO_UDP; 

    char port_s[BUF_SIZE]; 
    sprintf(port_s,"%d",port); /* port in char* */ 

    if((getaddrinfo(address, port_s, &hints, &result)) != 0) 
{ 
    perror("getaddrinfo()"); 
    exit(EXIT_FAILURE); 
} 

for (rp = result; rp != NULL; rp = rp->ai_next) 
{ 
    //Creating the socket 
    if((sockfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol)) == -1) 
    { 
     continue; 
    } 
    else 
    { 
     break; 
    } 
} 

    return sockfd; 
} 

のsendto(): 問題は、この機能で

static void write_server(int sockfd,struct addrinfo *client, char *buffer) /* write to server */ 
{ 
    if(sendto(sockfd, buffer, strlen(buffer), 0, client->ai_addr, sizeof (struct addrinfo)) < 0) 
     { 
     perror("sendto()"); 
     exit(EXIT_FAILURE); 
     } 
} 

メインです:

int main(int argc, char **argv) 
{ 
    if(argc != 3) 
    { 
    printf("Usage : %s addr_serv port_number\n", argv[0]); 
    return EXIT_FAILURE; 
    } 

    char name[20]="name"; 
    int port=atoi(argv[2]); 
    app(argv[1], port, name); 

    return EXIT_SUCCESS; 
} 

私は問題がありますwrite_server関数。 私はsendto()になります:無効な引数 誰かが問題のアイデアを持っていますか?

ありがとうございました!

答えて

1

sockfdに値を割り当てていません。init_connectionです。少なくともsocketに電話する必要があります。詳細については、getaddrinfoのmanページをチェックしてください:

 /* getaddrinfo() returns a list of address structures. 
      Try each address until we successfully bind(2). 
      If socket(2) (or bind(2)) fails, we (close the socket 
      and) try the next address. */ 

     for (rp = result; rp != NULL; rp = rp->ai_next) { 
      sfd = socket(rp->ai_family, rp->ai_socktype, 
        rp->ai_protocol); 
      if (sfd == -1) 
       continue; 

      if (bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0) 
       break;     /* Success */ 

      close(sfd); 
     } 
-1

あなたの数sockfdは初期化されませんし、有効ではありません。あなたはどこにでも接続を確立していません。接続を確立すると、sockfdが返されます。

関連する問題