Ловушка отмены: 6 на 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;
}

Как видите, я использую собственную библиотеку для управления интернет-адресом. Здесь 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 ответов

Другие вопросы по тегам