Articles of winsock

BSD套接字兼容包装winsock?

我试图将一个Linux应用程序移植到Windows。 该应用程序不是太复杂,使用所有相当标准的代码,很less有外部依赖。 主要的依赖是libelf(在mingw下编译得很好),pthreads(似乎有一个win32版本可用)和套接字。 主要的问题是套接字… Windows提供了WinSock,但是这与所有* nixes使用的BSD(Berkeley)套接字不是100%兼容的。 我想知道的是,是否有人在windows上公开了一个封装器来暴露一个BSD套接字API,但在后端调用Winsock,以便于移植?

为什么Windows不允许在模仿其他用户时启动WinSock

如果使用CreateProcessWithLogonW或CreateProcessAsUserW创build进程,则使用我自己的程序或其他程序调用winsock时不能运行。 它在创build套接字时返回这个错误: WSAEPROVIDERFAILEDINIT 10106 服务提供商未能初始化。 The requested service provider could not be loaded or initialized. 如果服务提供者的DLL无法加载(LoadLibrary失败)或提供者的WSPStartup或NSPStartup函数失败,则返回此错误 。 但是, WSAStartup似乎没有任何错误。 只需使用WSASocket创build套接字即可返回此信息。 更新: 错误: LoadUserProfile:错误代码2.找不到指定的文件 AdjustTokenPrivs:错误代码5.访问被拒绝

Multipe Send()和Recv()使用Winsock2

我正在使用Winsock2开展一个小型networking项目。 我正在使用TCP连接,实际上正在使用IRC作为例子,因为IRC非常简单。 我正在做的是连接到服务器并发送初始缓冲区,以便服务器识别连接。 这工作正常。 我担心的是我不能再次写入套接字。 看来我的程序挂起,如果我没有使用shutdown()(在SD_SEND)发送初始缓冲区后。 因此,我想发送的下一个数据(基于RFC 1459)是USER和NICK信息,但是,我觉得使用shutdown()是导致我目前的问题。 有没有办法重新初始化写入套接字? 谢谢! 添加的代码 请注意,这些是位于一个类,所以它仍然可能会被略微模糊。 我正在使用我拥有的元素将其写入一个更简单的示例。 一切都是正确的定义,所以如果我忘记定义的东西,我很抱歉,但我的循环variables的许多定义为类的范围。 int main(int argc,char *argv[]) { int iResult; SOCKET Connection; iResult = WSAStartup(MAKEWORD(2,2), &wsaData); if(iResult != 0) throw "Startup failed!"; // Prep stuff ZeroMemory(&hints,sizeof(hints)); // This struct is defined addrinfo hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; // Now resolve […]

当UDP数据包的大小小于12个字节时,UDP数据包将被丢弃。 我怎么知道原因?

我陷入了一个以前从未听说过的问题。 我正在做一个在某个angular色动作中使用UDP数据包的在线游戏。 在我开发了udp模块后,似乎工作正常。 虽然我们大部分的团队成员都没有问题,但是一个是我老板的人告诉我这个模块有什么问题。 我已经调查了这个问题,最后我发现了这个事实:在他的电脑上,如果udp数据包大小小于12,那么这个数据包永远不会被传送到另一个主机。 以下是一些额外的信息: 1〜11个字节的udp数据包被丢弃,12个字节和超过12个字节的数据包都可以。 操作系统:Microsoft Windows Vista Business NIC:Attansic L1千兆以太网10/100 / 1000Base-T控制器 WSASendTo返回TRUE。 回环udp数据包工作正常。 你怎么看待这个问题? 你怎么看?是什么原因导致这个问题呢? 我应该为下一步的事业做些什么? PS。 我不想填充所有数据包的长度高达12个字节。

将Winsock移植到Linux套接字

我有一个使用Winsock进行networking连接的程序,现在我们的要求之一是将程序移植到Linux上。 唯一阻止我们这样做的是Winsock。 我的问题是:我可以轻松地将它转移到Linux实现吗? 是否有任何我应该知道的陷阱,如果我只是简单地包含适当的头文件,我将不得不处理什么样的事情? 谢谢你的帮助! 我会张贴代码,但由于法律原因,我不能遗憾。 但是,我们的代码确实使用了以下内容: WSAStartup(..) WSACleanup(..) Socket(..) sendto(..) recvfrom(..) ioctlsocket(..) setsocketopt(..)

如何获得UPnP的内部IP,外部IP和默认网关

我想知道如何去得到: 内部IP地址; 外部IP地址; 和 默认网关 在Windows(WinSock)和Unix系统中。 提前致谢,

确定套接字和fd之间

在unix上, 一切都是函数read() , write() , close()在Win32上不支持的文件方法。 我想模拟它,但不知道如何区分sock是在WinSocks2上的套接字或fd 。 //returns 1 if `sock` is network socket, // 0 if `sock` is file desriptor (including stdio, stderr, stdout), … // -1 in none of above int is_net_socket(int sock) { // …? } 这应该如下: int mysock = socket(PF_INET, SOCK_STREAM, 0); int myfd = _open("my_file.txt", _O_RDONLY); printf("1: %d 2: […]

Winsock错误代码10014

string SendRequestToServer(std::string url) { struct sockaddr_in addr = { 0 }; struct hostent *host = NULL; // If the URL begins with http://, remove it. if(url.find("http://") == 0) url.erase(0, 7); // Get the host name. string hst = url.substr(0, url.find('/', 0)); url.erase(0, url.find("/", 0)); // Connect to the host. host = gethostbyname(hst.c_str()); if(!host) { Print("%s", […]

关于Winsock Kernel Buffer和Naglealgorithm的疑问

在阅读这篇文章的时候,我有一个疑问。 我明白,在传输小数据的时候,Naglealgorithm是默认启用的,它会合并小数据包。 这会导致在传输之前caching一些数据。 我相信Winsock Kernel Buffer是caching发生的地方。 纠正我,如果我错了。 这是否意味着如果Winsock内核缓冲区被设置为零,并且SO_SNDBUF选项将会禁用Naglealgorithm? 如果不是那么WINSOCKcaching小数据呢?

如何多播(发送)到第一个网卡?

我最近发现,如果我有一个拨号连接(这是一个自助服务terminal)和一个局域网连接,当build立拨号连接(与互联网接入),我的组播sendto默认拨号而不是我的LAN网卡。 这使得多点传送到拨号连接,而不是我的局域网,有几个多播用户。 我明白,我需要使用IP_MULTICAST_IF来设置我的多播套接字接口。 问题是如何枚举接口,如何在setsockopt中使用IP_MULTICAST_IF? 在Windows XP Embedded服务terminal上,总是只有一个局域网连接NIC。 我如何获得这个接口,并通过它的IP地址(这是什么IP_MULTICAST_IF期望??)setsockopt?