我正在尝试创建一个UDP交互客户机/服务器。我在试图用这段代码发送消息时遇到了一些问题。在执行过程中,我得到了以下错误:
sendto函数之后的"Address族不受协议支持“。提前感谢!
int prepare_udp_socket(char *pong_addr, char *pong_port)
{
struct addrinfo gai_hints, *pong_addrinfo = NULL;
int ping_socket;
int gai_rv;
int np;
/*** Specify the UDP sockets' options ***/
memset(&gai_hints, 0, sizeof gai_hints);
gai_hints.ai_family=AF_INET;
gai_hints.ai_socktype=SOCK_DGRAM;
gai_hints.ai_flags=0;
gai_hints.ai_protocol = IPPROTO_UDP;
if ((ping_socket = socket(gai_hints.ai_family, gai_hints.ai_socktype, gai_hints.ai_protocol)) == -1)
fail_errno("UDP Ping could not get socket");
/*** change socket behavior to NONBLOCKING ***/
if(fcntl(ping_socket,F_SETFL, O_NONBLOCK)==-1)
fail_errno("set NONBLOCKING socket fail");
//call getaddrinfo() in order to get Pong Server address in binary form
gai_rv=getaddrinfo(pong_addr, pong_port, &gai_hints, &pong_addrinfo);
if(gai_rv!=0){
printf("Getaddrinfo failed\n");
exit(1);
}
/*** connect the ping_socket UDP socket with the server ***/
if(connect(ping_socket, pong_addrinfo->ai_addr, pong_addrinfo->ai_addrlen)!=0){
fail_errno("Can't connect");
}
freeaddrinfo(pong_addrinfo);
return ping_socket;
}
double do_ping(int msg_size, int msg_no, char message[msg_size], int ping_socket, double timeout)
{
int lost_count = 0;
char answer_buffer[msg_size];
ssize_t recv_bytes, sent_bytes;
int offset;
struct sockaddr_storage pong_addr;
size_t pong_addr_len = sizeof(struct sockaddr_storage);
struct timespec send_time, recv_time;
double roundtrip_time_ms;
int re_try = 0;
/*** write msg_no at the beginning of the message buffer ***/
if(sprintf(message,"%d\n",msg_no)<0){
fail("sprintf(...) failed");
}
do {
debug(" ... sending message %d\n", msg_no);
/*** Store the current time in send_time ***/
if(clock_gettime(CLOCK_MONOTONIC,&send_time)!=0){
fail_errno("clock_gettime failed with sendTime");
}
/*** Send the message through the socket ***/
**if((sent_bytes = sendto(ping_socket, &message, msg_size,0,(struct sockaddr*)&pong_addr,pong_addr_len)) == -1){
fail_errno("Cannot send bytes throught the socket");**
}发布于 2016-05-10 09:08:40
问题是在您的do_ping函数中,sendto期望地址和长度作为其第5个和第6个参数,它们是输入参数,这意味着您需要指定要将数据包发送到的目标主机的地址,必须将地址初始化为有效的地址。实际上,你正在做的事情就像'recvfrom`‘。
另外,message是指向函数内char的指针,所以不要在sendto中使用&message,只需传递message。
struct sockaddr_storage pong_addr;
// pong_addr is not initialized here, initialize pong_addr to a valid address, like the one you got from `getaddrinfo` call
size_t pong_addr_len = sizeof(struct sockaddr_storage);
// then call sendto to send to the address
if((sent_bytes = sendto(ping_socket, message, msg_size, 0, (struct sockaddr*)&pong_addr, pong_addr_len)) == -1){
fail_errno("Cannot send bytes throught the socket");**
}https://stackoverflow.com/questions/37133671
复制相似问题