首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendto():UDP - IPv6中的文件描述符错误

sendto():UDP - IPv6中的文件描述符错误
EN

Stack Overflow用户
提问于 2012-04-27 23:27:12
回答 2查看 5K关注 0票数 1
代码语言:javascript
复制
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*/

  /* ..... */   
}

连接函数

代码语言:javascript
复制
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():问题出在此函数中

代码语言:javascript
复制
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);
      }
}

main:

代码语言:javascript
复制
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函数的问题。I变成sendto():无效的参数有人知道这个问题吗?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2012-04-27 23:28:57

您尚未为init_connection中的sockfd赋值。您至少需要调用一次socket。有关更多信息,请查看getaddrinfo的手册页:

代码语言:javascript
复制
       /* 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
EN

Stack Overflow用户

发布于 2012-04-28 00:17:39

您的sockfd从未初始化过,因此无效。您没有在任何地方建立连接。建立连接时返回sockfd。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10353432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档