unix domain socket 使用时crash

来源:互联网 发布:网络新技术有哪些() 编辑:程序博客网 时间:2024/06/09 21:27

项目中代码质量检查

char my_socket_path[MY_LEN_128];memset(my_socket_path, 0, sizeof(my_socket_path));snprintf(my_socket_path, MY_LEN_128 - 1, "%s", "/var/run/pidno/user/.mysocketpath");strcpy(server_addr.sun_path, my_socket_path);

代码运行没问题,但是提示使用strncpy 替换 strcpy

于是修正代码如下

char my_socket_path[MY_LEN_128];memset(my_socket_path, 0, sizeof(my_socket_path));snprintf(my_socket_path, MY_LEN_128 - 1, "%s", "/var/run/pidno/user/.mysocketpath");strncpy(server_addr.sun_path, my_socket_path, MY_LEN_128 - 1);

 

结果代码总是crash

一步步调试后,猜测可能sun_path的长度有问题,查找套接字的原始定义

struct sockaddr_un  {    __SOCKADDR_COMMON (sun_);    char sun_path[108];          };


因此,原因肯定是因为我们是128的buffer,拷贝到108的buffer,出现了问题。

修正如下

char my_socket_path[MY_LEN_108];memset(my_socket_path, 0, sizeof(my_socket_path));snprintf(my_socket_path, MY_LEN_108 - 1, "%s", "/var/run/pidno/user/.mysocketpath");strncpy(server_addr.sun_path, my_socket_path, MY_LEN_108 - 1);

最终,问题解决~