2012-04-27 171 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

您尚未在init_connection中爲sockfd賦值。您需要至少撥打socket一次。查看getaddrinfo的手冊頁以獲取更多信息:

 /* 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。

相關問題