在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
来存储我的地址。