我在主要功能中声明了struct sockaddr_in server
。
我将它传递给此函数以返回套接字文件描述符
int openSocket(char* ip_addr, int port, struct sockaddr_in* server){
int sockfd, len;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0){
perror("Failed to open socket: ");
exit(-1);
}
len = sizeof(server);
bzero(server, len);
server->sin_family= AF_INET;
inet_pton(AF_INET, ip_addr, &server->sin_addr);
server->sin_port= htons(port);
if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){
perror("Bind failed: ");
exit(-1);
}
return sockfd;
}
使用此调用将结构传递给函数
sockfd = openSocket(vector->ip_addr, vector->port, &server);
但是我收到以下错误。
Bind failed: : Address family not supported by protocol family
答案 0 :(得分:4)
len = sizeof(server);
这决定了指针的大小。你想要它指向的结构的大小,所以这应该是:
len = sizeof(*server);
答案 1 :(得分:3)
int openSocket(char* ip_addr, int port, struct sockaddr_in* server){
[...]
if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){
server
已经被声明为指针,所以我认为是&
运算符
bind()
来电时不需要。
答案 2 :(得分:0)
$(document).on('keyup change', '.quantity, .price', function() {
var row = $(this).closest('tr').get(0);
var rowPrice = $(row).find('.price').val();
var rowQuantity = $(row).find('.quantity').val();
$(row).find('.total').val((rowPrice * rowQuantity).toFixed(2));
$('.total').blur(function () {
var sum = 0;
$('.total').each(function() {
sum += parseFloat($(this).val());
});
$('#totals').val((sum).toFixed(2));
});
});
这很有趣 - 您使用int openSocket(char* ip_addr, int port, struct sockaddr_in* server){
,它具有您需要设置的以下属性:
sockaddr_in
- 这必须等于sun_family
。AF_INET
- 这是另一个名为sin_addr
unsigned long
的结构,您可能希望将其设置为s_addr
+ 。 INADDR_ANY
- 这需要一个需要使用sin_port
进行转换的服务器端口。 (确保此端口未使用 ++ !我的首选端口为htons()
以进行测试...)您似乎正在使用3333
,但我不确定它对设置inet_pton()
的影响是否相同。其他它看起来很好。
另一个方面是这一行可能存在问题:
sin_port
末尾的sockfd = socket(AF_INET, SOCK_DGRAM, 0);
指定[1]:
“指定协议为0会导致socket()使用适用于请求的套接字类型的未指定的默认协议。”
我可以想象一种可能性,即未指定的默认值对您的操作系统不正确或没有默认值。我会尝试0
来测试这是否有效。
+注意:这在技术上需要SOCK_STREAM
,但我的理解是这对此特定情况无效。
++注意:如果您正在编写客户端和服务器应用程序,请记住要小心哪个拥有该端口。
[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/socket.html