我有一个简单的客户端应用程序,它以低吞吐量从网络接收字节缓冲区.这是代码:
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) 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。我怎么能忽略它呢?目前,我正在调试,因为我的日志完全充满了此消息,所以很难找到所需的日志。
我使用2台计算机与一个应用程序发送和接收udp数据报.
当我通过应用程序将文件作为udp数据报发送时,经常
没有流量控制(ICMP禁用)
,我得到2个包改变他们的顺序,因此 - 包丢失.
有没有办法确保winsock和send()将以相同的方式发送数据包?
或者操作系统在做什么?我已经禁用了防火墙,并且计算机之间没有连接硬件开关(它们是直接连接的).需要网络设备配置?
谢谢
我已经有很长一段时间没有得到这个错误了,谷歌也没有多少帮助.
我是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) Windows句柄可以设置为可继承或不可继承,以控制子进程是否将接收它们(当bInheritHandles处于CreateProcessTRUE状态时).但是,使用SetHandleInformation标记SOCKET不可继承并不总是有效.特别是,当安装某些分层服务提供程序(LSP)时,子进程无论如何都会继承句柄.这特别容易导致监听套接字的错误.(但是,由于另一个问题,如果孩子尝试使用套接字,它将无法使用!真正的捕获22!)
SetHandleInformation.bInheritHandles真实.当安装(非IFS)LSP时,例如.PCTools Internet Security,监听套接字将在子进程中打开(可见netstat),尽管SetHandleInformation在创建子进程之前在套接字上调用以禁用继承.
有关替代方案,请参阅KB2398202中的(简要)步骤.
我正在尝试使用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 ...宏之后错误也没有解决.
提前致谢.
我们看到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上.
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 ?
我正在处理一些静态分析缺陷,并且导致我出现问题的是这个缺陷.
SOCKADDR_IN m_stLclAddr;
Run Code Online (Sandbox Code Playgroud)
缺陷是说我没有初始化以下内容:
我对熟悉WinSock API并不是很熟悉,但我做了一些研究,我只是想知道以下代码行是否会使用默认值初始化m_stLclAddr?
m_stLclAddr = { 0 };
Run Code Online (Sandbox Code Playgroud) 关于winsock的一些事我很困惑.
首先,包括Winsock2.h和winsock2.h之间的区别是什么('w'的上限)
第二,与wsock32.lib和ws2_32.lib链接有什么区别?
我尝试了几种组合,它们导致编译时错误.任何人都可以向我解释使用背后的逻辑推理吗?
谢谢尼克
winsock ×10
c++ ×4
c ×2
winapi ×2
windows ×2
winsock2 ×2
asyncsocket ×1
c# ×1
low-latency ×1
packet ×1
tcp ×1
threadpool ×1
udp ×1
visual-c++ ×1
windows-11 ×1
zeromq ×1