只有当我使用 valgrind 运行代码时,getpeername() 才会失败。如果我正常运行,getpeername 不会失败。
参数“in”将具有套接字相关信息,而“out”将没有垃圾(未初始化)。
SOCK_GetPeerName(ITS_SocketInfo in, ITS_SocketInfo out) { char buf[BUF_SZ] = {0};
memset(out, 0, sizeof(ITS_SocketInfo));
out->socket = in->socket;
out->type = in->type;
if ( (out->addr = calloc(1, sizeof(struct sockaddr))) == NULL)
{
return (ITS_ENOMEM);
}
out->asize = sizeof(struct sockaddr);
if (getpeername(in->socket, out->addr, (socklen_t*)&out->asize) != 0)
{
ITS_TRACE_ERROR(("Error: %s errno: %d\n", strerror_r(errno, buf, BUF_SZ), errno)); <--- failing with errno : 13 (permission denied)
free(out->addr);
return (ITS_EBADSOCKET);
}
out->af = in->af;
return (ITS_SUCCESS);
此问题仅在 centOS 6 系列中出现,如果我使用带有 valgrind 的 centOS 7.1 运行相同的源代码,getpeername 不会失败。
任何人都可以帮我解决这个问题吗?