Articles of winsock2

将multithreadingnetworking服务器从Unix移植到Windows

我正在努力将一些相对简单的networking代码从Unix移植到Windows。 简而言之,有一个pipe理所有networkingstream量的networking线程。 这个单线程大部分时间都在poll()中(我已经将它转换为select() ,在Windows中),networking线程只有在有传入的networking数据时才会唤醒。 当客户端命令到达时,networking线程将该命令触发到工作线程,以便在后端实际执行工作,然后返回到侦听更多传入命令。 命令是asynchronous的 – 多个命令可以进入一个套接字,一个接一个。 在任何时候,在一个连接上可以有几十个优秀的命令,所有这些命令都在不同的工作线程中工作。 问题是,当工作线程想要发送响应数据时,在工作线程尝试发送结果时,networking线程可能在poll()内部处于睡眠状态。 networking线程必须等待poll()超时(或接收到另一个数据包),才会注意到有新的出站数据排队等待发送。 在unix环境下,我通过在poll()监视的描述符中包含一个pipe道来处理这个问题,当一个工作线程有出站数据发送时,它还将一个数据字节写入pipe道来唤醒networking线程。 但是WinSock似乎只支持在套接字上等待,所以这种方法在Windows中不适用于我。 有没有什么方法可以让我在Windows上使用WinSock抢救这个体系结构(这样我就可以在不同的平台之间共享大部分代码),还是别无select,只能编写一个自定义的networking服务器实现来在Windows上使用? 感谢您的任何build议!

显示可变消息的自定义exception,不同编译器中的不同行为

我最近在做一些套接字编程,并开始用C ++编写代码。 由于我正在编写的程序将有几个组件必须通过套接字进行通信,所以我决定在一个类中封装套接字通信。 由于有几个可能发生的错误,我决定为套接字exception创build一个类,我这样定义它: class SocketException: public std::exception { public: SocketException(const std::string &message); ~SocketException() throw(); virtual const char * what() const throw(); private: std::string msg; }; 实施情况如下: SocketException::SocketException(const std::string &message) : msg(message) {} SocketException::~SocketException() throw() {} const char * SocketException::what() const throw() { std::stringstream stream; stream << msg + " Error number: "; stream << […]

有没有办法直接在Windows上使用winsock链接发送以太网数据包?

有没有办法直接在Windows上使用winsock链接发送以太网数据包? 我需要在链接上广播一个以太网数据包(例如,目的地Mac地址:广播​​(ff:ff:ff:ff:ff:ff))

如果没有超级用户,运行套接字创build失败,错误代码为10022

我在winsock上遇到了一个非常奇怪的行为。 两个图书馆(Wt http://www.webtoolkit.eu/libwebsocket https://libwebsockets.org/ ),以及我自己与示例代码得到错误代码10022(无效的参数。)当作为普通用户运行时,并从来没有以超级用户身份运行。 在自由项目的开发者和我都不能find一个理由。 我担心它可能是我们公司里一个非常隐蔽的白痴组织。 要触发的示例代码: #include <cstdlib> #ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <iphlpapi.h> #include <iostream> #include <exception> #include <stdexcept> int main(int argc, char** argv) { WSADATA sinfo; int sr = WSAStartup(MAKEWORD(2, 2),&sinfo); if (sr != 0) { std::cout << sr << std::endl; throw std::runtime_error("WSAStartup"); } […]

Linux到Windows C ++字节数组

我必须在C ++中复制以下Javafunction以从Linux获取数据到Windows。 Winsock2是最好的方法吗? 另外,任何参考代码build议? TIA,B import java.nio.ByteBuffer; 公共类MessageXdr { 专用的ByteBuffer缓冲区; 私人诠释大小; // taille max corps de message private static final int T_MAX_CORPS_MSG = 16384; public MessageXdr(){ buffer = ByteBuffer.allocate(4 * T_MAX_CORPS_MSG); 大小= 0; } 公共MessageXdr(byte []数组) { ByteBuffer tmpBuffer = ByteBuffer.wrap(array); buffer = tmpBuffer.asReadOnlyBuffer(); size = array.length; } public int getSize() { 退货尺寸; } public […]

C ++ WinSock2:connect()调用上的WSA_INVALID_HANDLE

美好的一天! 我是一个比较有经验的高级语言的程序员,但是这是我第一次在低级语言中使用套接字代码,所以请耐心等待。 我似乎在connect()调用时出错。 在我的主要function, WSAGetLastError()打印,这是错误号码6,根据MSDN是WSA_INVALID_HANDLE 。 这似乎很奇怪,因为没有关于connect()函数的MSDN页面上的特定错误代码的详细信息(除非我失明),我的谷歌search都没有结果 我正在使用自定义的socket_t结构,因为我的代码旨在(最终)是跨平台的。 socket_connect()函数是从主代码页调用的。 socket_t定义: typedef struct { //windows-specific SOCKADDR_IN *addr_in; u_long mode; SOCKET socket;//acutal SOCKET structure // General bool listening;//set to true if actively listening bool thread_terminate;//when boolean is set to true, listening thread terminates void (*error_callback) (int); http_response_t * response; } socket_t; socket_connect()函数: //see socket_t definition in socket.h […]

什么时候TCP套接字需要保持活动状态?

据我所知,TCP套接字上的Keep-alive有助于了解套接字是否不仅仅是打开的,而且两个套接字之间的连接实际上是活动的。 所以,我想问一下在Winsocks2中使用Keepalive的几个问题: 保持活动选项检测到死亡套接字时会发生什么情况? 如何在不实际使用send和recv的情况下检查连接是活着还是死亡? 如果我必须使用send和recv函数,那么首先使用keep-alive是什么意思?

把数据放回套接字缓冲区

简单的问题,似乎没有发现任何有用的东西在这里或谷歌:在Winsock2 API中,是否有可能把数据放回套接字内部缓冲区,当你已经检索到它使用recv()例如,看来它从来没有真正从缓冲区读取?

有没有什么办法可以使用getaddrinfo()和freeaddrinfo(),而且仍然是与旧版Windows兼容的程序?

在Winsock2库中getaddrinfo()和freeaddrinfo()仅在Windows XP和Windows XP中添加。 我知道如何在传统系统中replace它们,但根据Windows版本的条件使用将无济于事。 该应用程序不会在9x中启动,并显示一条消息,指出它已链接到WS2_32.dll中缺less的导出。 我正在使用MinGW来编译和链接代码,并希望继续使用它。 也许自己写这些函数? 非常感谢你所做的一切。

当name = null时,getsockname行为

我有窗口中的代码调用getsockname如下: getsockname(*x,NULL,0) 第三个参数(namelen)是IN \ Out参数,包含名称缓冲区的大小,以字节为单位。 返回时,namelen参数包含name参数的实际大小(以字节为单位)。 现在,我的问题是如果名称等于null,并且namelen等于零,会出现什么情况?我在linux中看到了,如果name是NULL,namelen被忽略,但是MSDN没有提到这种情况。 这里的MSDN链接是linux的IBM链接 提前致谢