标签: winsock

为什么SocketAsyncEventArgs的Completed回调经常在新创建的线程中执行而不是使用有界线程池?

我有一个简单的客户端应用程序,它以低吞吐量从网络接收字节缓冲区.这是代码:

private static readonly HashSet<int> _capturedThreadIds = new HashSet<int>();

private static void RunClient(Socket socket)
{
    var e = new SocketAsyncEventArgs();
    e.SetBuffer(new byte[10000], 0, 10000);
    e.Completed += SocketAsyncEventsArgsCompleted;

    Receive(socket, e);
}

private static void Receive(Socket socket, SocketAsyncEventArgs e)
{
    var isAsynchronous = socket.ReceiveAsync(e);
    if (!isAsynchronous)
        SocketAsyncEventsArgsCompleted(socket, e);
}

private static void SocketAsyncEventsArgsCompleted(object sender, SocketAsyncEventArgs e)
{
    if (e.LastOperation != SocketAsyncOperation.Receive || e.SocketError != SocketError.Success || e.BytesTransferred <= 0)
    {
        Console.WriteLine("Operation: {0}, Error: {1}, BytesTransferred: {2}", e.LastOperation, e.SocketError, e.BytesTransferred);
        return;
    }

    var …
Run Code Online (Sandbox Code Playgroud)

c# multithreading winsock asyncsocket threadpool

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

gethostbyname 说没有这样的服务是已知的。在指定的命名空间中找不到该服务

Windows 中的这段简单代码会导致gethostbyname.

#include <stdio.h>
#include <winsock.h>
int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);
    hostent* he = gethostbyname("www.stackoverflow.com");
    char* ip = inet_ntoa(*(struct in_addr*)he->h_addr_list[0]);
    printf(ip);
}
Run Code Online (Sandbox Code Playgroud)

它说:

onecore\net\netprofiles\service\src\nsp\dll\namespaceserviceprovider.cpp(550)\nlansp_c.dll!00007FFCFC1FC759: (caller: 00007FFD2856388E) LogHr(1) tid(6e14) 8007277C No such service is known. The service cannot be found in the specified name space.
Run Code Online (Sandbox Code Playgroud)

我在 Windows 上。使用 Visual Studio 2019。我怎么能忽略它呢?目前,我正在调试,因为我的日志完全充满了此消息,所以很难找到所需的日志。

c++ winsock winsock2 windows-11

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

确保UDP中的数据包顺序

我使用2台计算机与一个应用程序发送和接收udp数据报. 当我通过应用程序将文件作为udp数据报发送时,经常
没有流量控制(ICMP禁用)
,我得到2个包改变他们的顺序,因此 - 包丢失.

有没有办法确保winsock和send()将以相同的方式发送数据包?
或者操作系统在做什么?我已经禁用了防火墙,并且计算机之间没有连接硬件开关(它们是直接连接的).需要网络设备配置?
谢谢

windows udp winsock packet

9
推荐指数
3
解决办法
2万
查看次数

未定义的getaddrinfo参考

我已经有很长一段时间没有得到这个错误了,谷歌也没有多少帮助.

我是Winsock编程的新手,并试图从在线资源中学习.我正在尝试使用MSDN网站上的详细信息构建一个简单的服务器.每当我编译代码(MinGW)时,我都会收到标题(Undefined reference to getaddrinfo)中提到的错误.以下是代码:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#define WINVER WindowsXP

#include <windows.h>
#include <winsock2.h>
#include <winsock.h>
#include <ws2tcpip.h>
#include <stdio.h>

int main() {
    WSADATA wsaData;
    int iResult;
    iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    #define DEFAULT_PORT "27015"

    struct addrinfo *result = NULL, *ptr = NULL, hints;

    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    // Resolve the local address …
Run Code Online (Sandbox Code Playgroud)

c winsock

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

TCP SOCKET句柄可以设置为不可继承吗?

Windows句柄可以设置为可继承或不可继承,以控制子进程是否将接收它们(当bInheritHandles处于CreateProcessTRUE状态时).但是,使用SetHandleInformation标记SOCKET不可继承并不总是有效.特别是,当安装某些分层服务提供程序(LSP)时,子进程无论如何都会继承句柄.这特别容易导致监听套接字的错误.(但是,由于另一个问题,如果孩子尝试使用套接字,它将无法使用!真正的捕获22!)

重现步骤

  1. 创建例如监听套接字.使用标记为不可继承SetHandleInformation.
  2. 产生一个孩子,bInheritHandles真实.
  3. 关闭父级中的套接字,并尝试重新绑定到该端口.

当安装(非IFS)LSP时,例如.PCTools Internet Security,监听套接字将在子进程中打开(可见netstat),尽管SetHandleInformation在创建子进程之前在套接字上调用以禁用继承.

有关替代方案,请参阅KB2398202中的(简要)步骤.

有哪些变通方法?

winapi winsock

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

winsock弃用了没有警告

我正在尝试使用VS2015(C++控制台应用程序)创建UDP多播套接字程序.

我收到以下错误,

Error   C4996   'inet_addr': Use inet_pton() or InetPton() instead or define _WINSOCK_DEPRECATED_NO_WARNINGS to disable deprecated API warnings mulitcast_listener
Run Code Online (Sandbox Code Playgroud)

我尝试通过"Project" - >"Properties" - >"Configuration properties" - >"C/C++" - >"Preprocessor" - >"Preprocessor definitions"将_WINSOCK_DEPRECATED_NO_WARNINGS符号添加到我的项目设置中.但它仍然说相同.

然后我试图添加符号上方的#include"stdafx.h中"

#define _WINSOCK_DEPRECATED_NO_WARNINGS 1

然后在"项目" - >"属性" - >"配置属性" - >"C/C++" - >"通用" - >"SDL"检查中" 否"(/ sdl-)

现在我收到一条错误消息说

Warning C4603   '_WINSOCK_DEPRECATED_NO_WARNINGS': macro is not defined or definition is different after precompiled header
Run Code Online (Sandbox Code Playgroud)

最后我试着实施

inet_pton(AF_INET, HELLO_GROUP, (PVOID *)(&mreq.imr_multiaddr.s_addr));
Run Code Online (Sandbox Code Playgroud)

代替

mreq.imr_multiaddr.s_addr = inet_addr(HELLO_GROUP);
Run Code Online (Sandbox Code Playgroud)

我需要理解为什么即使在添加_WINSOCK ...宏之后错误也没有解决.

提前致谢.

winsock visual-c++

9
推荐指数
2
解决办法
3万
查看次数

为什么Windows7上的TCP/IP需要500个预热才能进行预热?(w10,w8证明不会受到影响)

我们看到ZeroMQ上有一个奇怪且无法解释的现象,Windows 7通过TCP发送消息.(或者inproc,因为ZeroMQ在Windows内部使用TCP进行信令).

这种现象是前500条消息越来越慢,延迟越来越慢.然后,除了由CPU /网络争用引起的峰值之外,延迟下降和消息一直快速到达.

这里描述了这个问题:https://github.com/zeromq/libzmq/issues/1608

它始终是500条消息.如果我们发送没有延迟,那么消息被批处理,所以我们看到这个现象延伸了几千个发送.如果我们在发送之间延迟,我们会更清楚地看到图表.即使在发送之间延迟多达50-100毫秒也不会改变事情.

邮件大小也无关紧要.我已经测试了10字节消息和10K消息,结果相同.

最大延迟始终为2毫秒(2,000 usec).

在Linux机器上,我们没有看到这种现象.

我们想要做的是消除这个初始曲线,因此消息与正常的低延迟(大约20-100 usec)保持新的连接.


更新:该问题不会在Windows 10和8上显示.它似乎发生在Windows 7上.

tcp winsock distributed-computing zeromq low-latency

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

我真的必须链接 Ws2_32.lib 吗?

MSDN 上的所有 Winsock2 示例都表明我必须将 Winsock2 库静态链接为:

#pragma comment(lib, "ws2_32.lib")
Run Code Online (Sandbox Code Playgroud)

确保构建环境链接到 Winsock 库文件 ?>Ws2_32.lib。使用 Winsock 的应用程序必须与 Ws2_32.lib >库文件链接。#pragma 注释向链接器表明需要 Ws2_32.lib > 文件。

但为什么我使用它而不是简单地加载Windows中现有的Ws2_32.dll(自Windows 2003以来,据我了解,根据MSDN https://learn.microsoft.com/en-us/windows/win32/api/winsock2/的要求nf-winsock2-recv )

所以我可以使用这样的东西:

typedef int WSAAPI(WINAPI* recv_func)(SOCKET s, char *buf, int len, int flags);

HINSTANCE hGetProcIDDLL = LoadLibraryA("ws2_32.dll");
my_recv = (recv_func)GetProcAddress(hGetProcIDDLL, "recv");
Run Code Online (Sandbox Code Playgroud)

或者我可以只使用 Winsock2.h 标头并使用 /MD 标志编译程序:

include <winsock2.h>
//#pragma comment(lib, "ws2_32.lib")
Run Code Online (Sandbox Code Playgroud)

是否可以?我可以像第一个示例一样使用 /MD 或动态加载 ws2_32.dll ,而不将 ws2_32.lib 静态链接到我的应用程序,因为自 Win2003 以来的所有 Windows 都在 System32 文件夹中包含 ws2_32.dll ?

c c++ winapi winsock winsock2

9
推荐指数
1
解决办法
3万
查看次数

C++ - 初始化SOCKADDR_IN

我正在处理一些静态分析缺陷,并且导致我出现问题的是这个缺陷.

SOCKADDR_IN m_stLclAddr;
Run Code Online (Sandbox Code Playgroud)

SOCKADDR_IN是WinSock API的成员

缺陷是说我没有初始化以下内容:

  • m_stLclAddr.sin_port
  • m_stLclAddr.sin_zero
  • m_stLclAddr.sin_addr
  • m_stLclAddr.sin_family

我对熟悉WinSock API并不是很熟悉,但我做了一些研究,我只是想知道以下代码行是否会使用默认值初始化m_stLclAddr?

m_stLclAddr = { 0 };
Run Code Online (Sandbox Code Playgroud)

c++ initialization winsock

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

Winsock2.h vs winsock2.h和wsock32.lib vs ws2_32.lib

关于winsock的一些事我很困惑.

首先,包括Winsock2.h和winsock2.h之间的区别是什么('w'的上限)

第二,与wsock32.lib和ws2_32.lib链接有什么区别?

我尝试了几种组合,它们导致编译时错误.任何人都可以向我解释使用背后的逻辑推理吗?

谢谢尼克

c++ windows winsock

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