Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TCP-IP套接字C:尝试连接到服务器套接字时出现错误地址_C_Sockets_Tcp_Segmentation Fault_Client Server - Fatal编程技术网

TCP-IP套接字C:尝试连接到服务器套接字时出现错误地址

TCP-IP套接字C:尝试连接到服务器套接字时出现错误地址,c,sockets,tcp,segmentation-fault,client-server,C,Sockets,Tcp,Segmentation Fault,Client Server,我正在尝试创建一个客户端-服务器tic-tac-toe游戏作为家庭作业。我在单独的函数中设置服务器侦听器和连接,而不是在主程序中。服务器套接字创建成功,但客户端连接失败,我认为这是导致随后出现seg故障的原因 我已经查找了类似的问题,并尽可能地对代码进行了调整,比如为sizeof(cli_addr)设置一个变量,而不是直接将其传递给accept()。我不知道为什么它不起作用 这是设置连接的函数 void setup_connections(int serversocket,int *client

我正在尝试创建一个客户端-服务器tic-tac-toe游戏作为家庭作业。我在单独的函数中设置服务器侦听器和连接,而不是在主程序中。服务器套接字创建成功,但客户端连接失败,我认为这是导致随后出现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++;

    }
}
void setup\u连接(int-serversocket、int*clientsocket、int-portnum){
int cli_size,con_num=0;
cli_addr中的结构sockaddr_;
//服务器正在侦听客户端
监听(serversocket,5);

而(con_num您应该注意您收到的警告:

警告:将“int”传递到的整数到指针转换不兼容 类型为“socklen_t*”的参数(也称为“unsigned int*”) [-Wint conversion]clientsocket[con_num]=accept(serversocket,(结构 sockaddr)和cli\u addr、cli\u size)

你打折扣是错误的:

然而,我检查的所有示例都是这样通过的

如果您所看到的所有示例都使用与您类似的代码,那么您迫切需要找到更好的示例。然而,更重要的是,您需要学习依赖文档,最好是作为第一资源,但至少要清除不确定性,例如“这是我应该关心的警告吗?”(提示:除非您能够表达基于文档的理由,否则答案总是“是的,我应该关心警告”。)

快速查看会发现第三个参数应该是一个指针,指向包含您传递的地址对象大小的变量,函数将更新该变量(通过指针)包含返回的地址的实际长度。相反,您传递的是大小本身,而转换为指针几乎肯定会产生无效的大小。事实上,您很幸运,它会产生运行时错误,因为另一种方法是在程序中的某个随机位置默默地产生内存损坏

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

我在编译cli\u大小类型时收到警告

*警告:不兼容的整数到指针转换将“int”传递到类型为“socklen\u t*”(也称为“unsigned int*”)[-Wint conversion]clientsocket[con\u num]=accept(serversocket,(struct sockaddr)&cli\u addr,cli\u size)的参数

然而,我检查的所有示例都是这样通过的

不,他们不会。如果他们这样做了,他们会在编译时得到与您相同的错误

这是
accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//                                                      ^ Note the asterisk
您可以清楚地看到,它需要指向
socklen\u t
的指针,而不是
socklen\u t
。您的
accept
行应该如下所示:

clientsocket[con_num] = accept(serversocket,(struct sockaddr *) &cli_addr,&cli_size); 
//                                                                        ^ Note the pointer indirection
如果要使用
cli\u addr
结构,则应检查返回的大小是否大于传入的大小,因为如果大于,则表示地址结构已被截断

下面是报告的内容

addrlen参数是一个值结果参数:调用者必须初始化它以包含addr指向的结构的大小(以字节为单位);返回时,它将包含对等地址的实际大小

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//                                                      ^ Note the asterisk
clientsocket[con_num] = accept(serversocket,(struct sockaddr *) &cli_addr,&cli_size); 
//                                                                        ^ Note the pointer indirection