我在主函数
中声明了一个指向以下结构的指针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_aton(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;
}
然而,当我尝试读取传递给函数的结构中的各个字段时,我得到一个seg错误。那是我在主
中运行以下代码的时候sockfd = openSocket(vector->ip_addr, vector->port, server);
printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );
传递给openSocket函数的值是正确的。
我得到segmentation fault
。任何帮助表示赞赏。
答案 0 :(得分:2)
在我再次查看您的代码之后,我发现有三个错误。
在main()
中,您刚刚声明了一个指向struct sockaddr_in
的指针,但您没有指定它,您可以定义struct sockaddr_in server
并传递&server
到openSocket()
。
在openSocket中,&#34;服务器&#34;声明为指针,但您的语句len = sizeof(server); bzero(&server, len);
不正确,这是您的分段违规发生的地方。
在openSocket()
,bind(sockfd, (struct sockaddr*)&server, len)
不正确,您不需要使用&server
,只需使用server
。
所以你应该改变你的代码如下:
len = sizeof(server); ----> len = sizeof(struct sockaddr_in)
bzero(&server, len); ----> bzero(server, len);
if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){ ----->
if((bind(sockfd, (struct sockaddr*)server, len)) < 0){
struct sockaddr_in* server;
sockfd = openSocket(vector->ip_addr, vector->port, server);
printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );
---->
struct sockaddr_in server;
sockfd = openSocket(vector->ip_addr, vector->port, &server);
printf("%s %d\n", inet_ntoa(server.sin_addr), htons(server.sin_port) );
答案 1 :(得分:0)
您刚刚将“server”声明为指向struct sockaddr_in
的指针,但您没有指定它。你可以这样做:
struct sockaddr_in server;
sockfd = openSocket(vector->ip_addr, vector->port, &server);
printf("%s %d\n", inet_ntoa(server.sin_addr), htons(server.sin_port) );
答案 2 :(得分:-1)
bind(sockfd, (struct sockaddr*)&server, len)
问题出在这里。 server
已经是一个指针。你不应该拿它的地址。
bind(sockfd, (struct sockaddr*)server, len)
而且,正如@nos指出的那样,你需要在某处初始化它。静态变量没有理由成为指针。它可以是struct sockaddr_in
。