我在主函数中声明了指向以下结构的指针
struct sockaddr_in* server;
我将此结构用于返回绑定(bind)到此结构的套接字描述符的函数。
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;
}
但是,当我尝试读取传递给函数的结构中的各个字段时,我得到一个段错误。那是当我在我的 main 中运行以下代码时
sockfd = openSocket(vector->ip_addr, vector->port, server);
printf("%s %d\n", inet_ntoa(server->sin_addr), htons(server->sin_port) );
传递给 openSocket 函数的值是正确的。
我得到一个
segmentation fault
.任何帮助表示赞赏。
最佳答案
再次查看您的代码后,我发现有三个错误。
main()
,您刚刚声明了一个指向 struct sockaddr_in
的指针,但你没有赋值,你可以定义struct sockaddr_in server
并通过 &server
至openSocket()
. 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) );
关于c - 绑定(bind)套接字 : SIGSEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33838627/