1 void local_sdk_server::wait_remote_client_connect_and_comm() 2 { 3 /*服务器服务启动,等待客户端的链接的到来*/ 4 //sockaddr_in client_addr; 5 sockaddr client_addr; 6 socklen_t len; 7 user users;//client 8 string operation_key; 9 string operation_value; 10 ROS_INFO( "Watting connect......................." ); 11 len = 1; 12 int accept_fd = accept( listen_fd, &client_addr, &len ); 13 if( accept_fd < 0 ) 14 { 15 ROS_ERROR("errno is %s",strerror(errno));//strerror(errno)转换错误码为对应的错误信息
16 ROS_ERROR("accept failed accept_fd is %d", accept_fd);
17 }
18 if( accept_fd >= 0 )//用户连接成功,返回的新的文件描述符 19 { 20 ROS_INFO( "accept_fd: %d", accept_fd );
...
问题现象:
server运行在accept函数处等待client的连接,当有client来连接时,accept函数返回值为-1(错误).
问题解决:
为知道是什么原因导致了accept返回失败,添加 ROS_ERROR("errno is %s",strerror(errno));(printf在此处打印不出来),打印出错误原因为Invalid argument(此时可以百度),即accept函数的参数无效,检查发现len只进行了定义socklen_t len,未进行初始化,对其初始化后问题解决.
问题总结:
1.在另外一辆IGV上没有出现上述问题,并不代表程序没有问题,往往是因为系统对未初始化的参数处理不同,所以运行结果可能是成功的.
2.一定要注意对定义的参数进行初始化,否则可能会是意向不到的数,进而影响程序.