gpt4 book ai didi

c - TCP-IP套接字C : Bad address error when trying to connect to server socket

转载 作者:行者123 更新时间:2023-12-03 11:57:45 27 4
gpt4 key购买 nike

我正在尝试创建客户端服务器井字游戏作为家庭作业。我在单独的功能中而不是在主程序中设置服务器监听器和连接。服务器套接字创建成功,但是客户端连接失败,我认为这是导致随后的seg错误的原因。

我已经查找了类似的问题,并尽可能地对代码进行了调整,例如为sizeof(cli_addr)设置变量,而不是直接将其传递给accept()。我不知道为什么它不起作用。

这是建立连接的功能

void setup_connections(int serversocket,int *clientsocket,int portnum){
int cli_size,con_num = 0;
struct sockaddr_in cli_addr;

//server is listening for clients
listen(serversocket,5);

while(con_num<2){


cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = INADDR_ANY;
cli_addr.sin_port = htons(portnum);

//accept connection while creating client socket
cli_size = sizeof(cli_addr);
clientsocket[con_num] = accept(serversocket,(struct sockaddr *) &cli_addr,cli_size);

if(clientsocket[con_num]<0){
perror("Error: ");
}

con_num++;

}
}

编译cli_size类型时收到警告。

*warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'socklen_t *' (aka 'unsigned int *') [-Wint-conversion] clientsocket[con_num] = accept(serversocket,(struct sockaddr ) &cli_addr,cli_size);



但是,我检查的所有示例都通过了这样的检查。

这是设置服务器套接字的功能。
int setup_server(int portnum){
int serversocket,serv_bind;
struct sockaddr_in server_addr;


serversocket = socket(AF_INET, SOCK_STREAM, 0);
if(serversocket<0){
printf("Failed to create server\n");
}

//set up server info
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(portnum); //port number given by user

//link server address to socket
serv_bind = bind(serversocket,(struct sockaddr *) &server_addr,sizeof(server_addr));
if(serv_bind<0){
printf("Failed to bind\n");
}

return serversocket;
}

这是main.c中调用它们的代码:
int portnum,serversocket, clientsocket[2]; //sockets


portnum = atoi(argv[1]);
if(argc < 2){
printf("Port number not given");
}

//create sockets
serversocket = setup_server(portnum);
setup_connections(serversocket,clientsocket);

运行该程序后,我得到的是:

Error: : Bad Address

Error: : Bad Address

Segmentation fault: 11



如果您可以向我解释我做错了什么,那将非常有帮助。

最佳答案

您应该注意收到的警告:

warning: incompatible integer to pointer conversion passing 'int' to parameter of type 'socklen_t *' (aka 'unsigned int *') [-Wint-conversion] clientsocket[con_num] = accept(serversocket,(struct sockaddr ) &cli_addr,cli_size);



您打折是错误的:

However, all the examples I checked pass it like this.



如果您看过的所有示例都使用与您类似的代码,那么您迫切需要找到更好的示例。但是,更重要的是,您需要学会依赖文档,最好是作为第一个求助手段,但是至少要消除不确定性,例如“此警告我应该关注吗?” (提示:直到并且除非您可以表达基于文档的原因,否则答案始终是“是,我应该注意警告”。)

快速浏览 the docs for accept() 将发现第三个参数应该是指向包含您传递的地址对象大小的变量的指针,并且该函数将更新该变量(通过指针)以包含地址的实际长度。回来。相反,您要传递大小本身,并且几乎可以肯定地转换为指针将产生无效的大小。您实际上很幸运,它确实这样做了,所以您遇到了运行时错误,因为另一种选择是您在程序的某个随机位置无提示地产生了内存损坏。

注意 bind()是不同的。它要求您直接而不是间接传递地址的大小。这是明智的,因为没有理由要修改大小。

关于c - TCP-IP套接字C : Bad address error when trying to connect to server socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54463373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com