中止陷阱:发送到6

时间:2016-04-21 14:48:45

标签: c sigabrt sendto

在Mac OS X上,当我调用Abort trap: 6函数(实际上几毫秒)后,我有一个sendto

这里是代码:

ssize_t writeToSocketUDP(SocketUDP *sock, const AdresseInternet *adresse,
  const char *buffer, int length) {

  if (sock == NULL || adresse == NULL || buffer == NULL) {
    return -1;
  }

  struct sockaddr sockaddr;
  if (AdresseInternet_to_sockaddr(adresse, &sockaddr) != 0) {
    return -1;
  }
  socklen_t sockaddr_len = sizeof(sockaddr);

  ssize_t count = sendto(sock->sockfd, buffer, (size_t) length, 0, &sockaddr,
    sockaddr_len); // HERE!

  return count;
}

如您所见,我使用自定义库来管理Internet地址。这是AdresseInternet_to_sockaddr函数:

int AdresseInternet_to_sockaddr(const AdresseInternet *adresse, struct sockaddr *addr){
  sa_family_t famille = adresse->sockAddr.ss_family;
  switch (famille){
  case AF_INET:
    memcpy(addr, &(adresse->sockAddr), sizeof(struct sockaddr_in));
    break;
  case AF_INET6:
    memcpy(addr, &(adresse->sockAddr), sizeof(struct sockaddr_in6));
    break;
  default:
    return -1;
  }
  return 0;
}

这里是AdresseInternet结构:

typedef struct {
  struct sockaddr_storage sockAddr;
  char nom[_DNS_NAME_MAX_SIZE];
  char service[_SERVICE_NAME_MAX_SIZE];
} _adresseInternet_struct;

typedef _adresseInternet_struct AdresseInternet;

这是一个学校项目,AdresseInternet由我的老师提供。

分辨

struct sockaddr不足以存储sockaddr_in6(如果是IPv6)。 所以我使用struct sockaddr_storage来存储我的地址。

0 个答案:

没有答案