我在代码中遇到了发送内容的问题。
我得到了例如2 Server。
这是服务器1:
unsigned int ip = 19216821;
unsigned int port = 4000;
char str[0];
sprintf(str, "%d", ip);
if ((dest_he=gethostbyname(str)) == NULL) { // get the host info
herror("gethostbyname");
exit(1);
}
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(port);
dest_addr.sin_addr = *((struct in_addr *)dest_he->h_addr);
memset(dest_addr.sin_zero, '\0', sizeof dest_addr.sin_zero);
然后我想将我的缓冲区发送到dest_addr
if(sendto(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&dest_addr ,sizeof(struct sockaddr_storage)) == -1){
printf("error sending data\n");
return -1;
}
但我仍然得到sendto(..)== -1。
我的其他服务器仍在等待答案。 服务器2:
if(recvfrom(sockfd, &buffer, sizeof(buffer),0, (struct sockaddr *)&rand_addr ,&addr_size) == -1){
printf("error receiving data");
return -1;
}
我认为我的问题是我设置了dest_addr错误或?
答案 0 :(得分:1)
首先,您的标题与您的描述并不匹配。不过,我会尽力回答你的问题。
基本上,您没有正确使用函数gethostbyname
。正如名称所说,它的名称不是地址的主机。因此,正确的用法是:
struct hostent *host = gethostbyname("localhost");
要将结果复制到struct
,您可以使用:
memcpy(&dest_addr.sin_addr, host->h_addr_list[0], host->h_length);
另一方面,如果您想将消息发送到已知的IP地址,您可以使用:
char *ip = "127.0.0.1"
inet_aton(ip , &dest_addr.sin_addr)
除此之外一切都很好。有很多关于如何使用TCP,UDP甚至RAW套接字的在线示例。我希望这是你期待的答案。