获取Windows平台上通过Unix Socket连接的进程ID
Windows平台获取已连接Unix Socket进程ID的方法
Windows从10版本1709开始原生支持AF_UNIX套接字,但没有提供和Linux/Darwin平台getsockopt()完全对等的接口来直接获取连接进程ID,不过可以通过以下两种方式实现:
原生AF_UNIX套接字方案
当AF_UNIX套接字建立连接后,调用WSAIoctl函数,传入SIO_GET_BASIC_INFO作为控制码,从返回的WSABASIC_INFO结构体中提取ProcessId字段,该字段即为对等连接进程的ID。示例代码片段如下:WSABASIC_INFO basicInfo = {0}; DWORD bytesReturned = 0; int result = WSAIoctl( sockfd, SIO_GET_BASIC_INFO, NULL, 0, &basicInfo, sizeof(basicInfo), &bytesReturned, NULL, NULL ); if (result != SOCKET_ERROR) { DWORD peerPid = basicInfo.ProcessId; // 使用peerPid进行后续操作 }旧版本兼容的命名管道方案
在Windows原生支持AF_UNIX之前,不少场景用命名管道模拟Unix套接字行为。这种情况下,可直接调用GetNamedPipeClientProcessId函数,获取连接到命名管道的客户端进程ID。
需要注意的是,SIO_GET_BASIC_INFO仅适用于Windows 10 1709及以上版本的原生AF_UNIX套接字,且调用进程需具备足够权限才能读取对等进程的ID。
内容的提问来源于stack exchange,提问作者mfbarnable
相关产品推荐
相关产品推荐

