标签: windows-socket-api

是否可以判断是否在进程中调用了WSAStartup?

我已经开始编写一个使用套接字的ActiveX控件.

使用此控件的应用程序可能也可能不使用套接字.我的控件是否可以判断是否已调用WSAStartup?

如果没有,请拨打电话.一个小小的测试表明,多次调用WSAStartup是很容易的.但是如果要求使用不同的winsock版本会发生什么?这会破坏应用程序的其他部分吗?

windows winsock2 windows-socket-api wsastartup

15
推荐指数
2
解决办法
1万
查看次数

可以从几个线程调用WSAStartup()导致死锁吗?

我正在开发一个具有一个TCP服务器和几个UDP服务器/监听器的应用程序.每个服务器都是一个单独的线程,与已建立的TCP连接的工作线程相同.我在每个线程中调用WSAStartup().

有时,调用WSAStartup()会挂起(对我来说看起来像是一个死锁).这是堆栈跟踪:

  ntdll.dll!_KiFastSystemCallRet@0()  
  ntdll.dll!_ZwWaitForSingleObject@12()  + 0xc bytes 
  ntdll.dll!_RtlpWaitForCriticalSection@4()  + 0x8c bytes 
  ntdll.dll!_RtlEnterCriticalSection@4()  + 0x46 bytes 
  ntdll.dll!_LdrpGetProcedureAddress@20()  + 0x17d bytes 
  ntdll.dll!_LdrGetProcedureAddress@16()  + 0x18 bytes 
  kernel32.dll!_GetProcAddress@8()  + 0x3e bytes 
  vld.dll!03203723()  
  [Frames below may be incorrect and/or missing, no symbols loaded for vld.dll] 
  ws2_32.dll!CheckForHookersOrChainers()  + 0x22 bytes 
  ws2_32.dll!_WSAStartup@8()  + 0xa7 bytes 
Run Code Online (Sandbox Code Playgroud)

这种死锁发生在初始化时.我看到TCP服务器已启动,并且已建立一个TCP连接,而只启动了一个UDP服务器.堆栈跟踪来自应启动其余UDP服务器的功能.我的猜测是,当我尝试初始化UDP服务器并调用WSACStartup()时,另一个步骤是处理另一个套接字操作,例如新的TCP连接,它还调用WSAStartup()?

我的问题是从几个线程调用WSAStartup()是否会导致这种死锁?我检查的是在死锁之前调用的WSACleanup(),但事实并非如此.执行永远不会到达任何WSACleanup().

我知道只有一次调用WSAStartup就足够了,但是多次调用WSAStartup()应该不是问题(MSDN)1):"如果需要获取WSADATA结构信息,应用程序可以多次调用WSAStartup不止一次." 因此,我想确定这个死锁是由WSAStartup()还是其他原因造成的.

c++ multithreading deadlock windows-socket-api wsastartup

5
推荐指数
1
解决办法
7020
查看次数

通过Socket发送SendBuf时出现10057 WSA异常

客户:

//is called when the client tries to log in
    procedure TLogin_Form.btnLoginClick(Sender: TObject);
    var LoginQuery: TQuery;
    begin
        //If socket not open, open it
        if not LoginSocket.Active then
        begin
            LoginSocket.Open;
        end;

      //create package
      LoginQuery.Login := ledtName.Text;
      LoginQuery.Passwort := ledtPasswort.Text;
      LoginQuery.IP := LoginSocket.Socket.LocalAddress;
      //send package
      LoginSocket.Socket.SendBuf(LoginQuery, SizeOf(LoginQuery));
    end;
Run Code Online (Sandbox Code Playgroud)

服务器:

    //This procedure is executed when I click on start server button
    procedure TServer_Form.btnStartStopClick(Sender: TObject);
    begin
        //If not open, open it
        if not ServerSocket.Active then
        begin
          btnStartStop.Caption := 'stop server'; 
          //Open ServerSocket
          ServerSocket.Open;
        end …
Run Code Online (Sandbox Code Playgroud)

sockets delphi exception windows-socket-api

1
推荐指数
1
解决办法
2279
查看次数