我在主函数中声明了一个指向以下结构的指针
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 函数的值是正确的。
我遇到段错误
。任何帮助表示赞赏。
最佳答案
我再次查看了你的代码,发现有三个错误。
在
main()
,您刚刚声明了一个指向struct sockaddr_in
的指针,但是你没有分配它,你可以定义struct sockaddr_in server
并通过&server
至openSocket()
.在openSocket中,“server”被声明为指针,但是你的语句
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/