windows DLL是否有可能在多个线程或进程之间使用相同的套接字编号

windows DLL Is there are possibility to use same socket number among multiple threads or processes?

本文关键字:之间 编号 套接字 进程 有可能 是否 DLL 线程 windows      更新时间:2023-10-16

我已经创建了在windows资源管理器上更新ikon的应用程序(DLL)。我正在使用tcp套接字与服务器通信(在同一台计算机上)在那里我可以获得文件的状态。我在有很多文件的目录上遇到了性能问题(我从资源管理器中获得的文件名)。我发现了瓶颈,是客户端tcp/ip,在那里我初始化了tcp套接字。例如,如果我在目录上有50个文件,我将获得50个线程或进程,每个线程或进程初始化Winsock,然后将数据发送到服务器。

这是我注册服务器的DLL主目录STDAPI DllRegisterServer(无效)//注册组件。hr=RegisterInprocServer(szModule,CLSID_IconOverlay,L"LoqOverlayBlue.CustomIcon类",L"公寓");

以及我的CustomIcon类,其中IsMemberOf函数用于获取文件名,函数GetStatus用于通过发送到服务器来获取文件状态来处理文件//获取文件的状态。HRESULT CustomIcon::IsMemberOf(PCWSTR pwszPath,DWORD dwAttrib){

std::string fileName;
HRESULT result = S_FALSE;
std::size_t found = fileName.find("my directory");
if (found != std::string::npos) {
fileName.append("2;");
fileName.append(CT2A(pwszPath));
if (GetStatus(fileName) == Red) {
return S_OK;
}       
}
return S_FALSE;
}

每当我点击windows资源管理器上的刷新按钮或点击目录时,函数IsMemberOf()就会被调用,并且我会得到该目录中的所有文件。在GetStatus函数中,我初始化winsock并将文件名发送到服务器以获取文件的状态,以便更新windows资源管理器上的图标。

问题我不知道它是线程还是进程。有人知道它是线程还是进程吗?在这种特殊情况下,是否有可能在多个线程或进程之间使用相同的套接字编号?

您可以跨线程共享相同的套接字句柄。每个文件有一个线程的具体原因是什么?

与其在线程之间共享套接字编号,不如创建一个与负责套接字的单个通信线程相关联的队列。通过这种方式,您可以以取消阻止的方式将每个文件名发送到队列,并让套接字线程与服务器通信。如果需要返回图标资源,可以让线程等待来自套接字服务器的信号,通知资源准备就绪。

更新

如果你遵循这种设计,那么让这么多线程等待一个线程是没有用的。您可以使用从套接字线程更新的另一个队列来存储到达的图标,使用一个扫描文件名的线程,使用另一个线程来更新第二个队列中的图标。按照这个模式,只需要3个线程(或者如果将套接字线程分为写入线程和读取线程,则可能需要4个线程)。