Ловушка отмены: 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
сохранить мой адрес.