Articles of winsock

如何在Mac OS X上编译包含Winsock库的C程序

我正在用C开发一个可移植的客户端 – 服务器应用程序。我希望能够在Mac OS X以及Linux和Windows中进行编译。 在这一刻,我正在使用Mac OS X.我试图通过预处理器指令来实现这个结果,如下所示: #include <stdio.h> #include <stdlib.h> #if defined WIN32 #include <winsock.h> #else #define closesocket close #include <sys/socket.h> #include <arpa/inet.h> #include <unistd.h> #endif int main(void) { #if defined WIN32 WSADATA wsaData; WORD wVersionRequested; wVersionRequested = MAKEWORD(2, 2); int iResult = WSAStartup(wVersionRequested, &wsaData); if (iResult != 0){ printf("Error at WSAStartup()\n"); printf("A […]

windows tcp栈的缓冲区限制,特别是使用winsocket

在处理通过winsocket进行通信的Windows应用程序时,我已经列举了以下场景: Alice与Bob发起一个tcp会话 Bob接受,会话build立。 鲍勃正在发送大量的数据(〜1000 MB)。 鲍勃继续做其他事情。 同时,Alice缓慢读取数据,当时N个字节(其中N是Alice缓冲区的大小,只分配一次,因为数据被写入到每个读取之间的文件中, 该缓冲区由应用程序分配 )。 在debugging时,我发现Bob的send()永远不会被阻塞,即使在第一次读取之前我暂停了Alice。 问题是,什么保证整个数据( 〜1000 mb )将保持可供爱丽丝阅读? 有没有已知的/可configuration的参数,限制这个缓冲区的长度?

将连接redirect到C中指定的本地端口的服务器应用程序

我正在C中创build一个服务器应用程序的乐趣和知识(没有类,请不要理解他们呢)。 这个应用程序的目的是监听一个指定的端口,可以说8118当连接到服务器将有一个login后,我想转发连接到pipe理控制台。 pipe理控制台端口将在本地监听,这意味着它不会在路由器上进行端口转发。 让我们把这个端口定义为5115。 所以它看起来像这样 客户端 – >服务器:8118 – > ServerRedirect到本地5115 这样做的目的是我最终将根据命令login后转发到多个本地端口。 有没有这样做的有效方法? 还有我可能遇到的任何问题,我应该注意? 提前致谢。

Linux和Windows套接字编程中的INADDR_ANY之间的区别

我的Winsock Delphi应用程序应该监听所有networking接口上的多播UDP / IPstream。 它正常听,直到我在另一台PC上使用不同的networking适配器的优先顺序尝试它。 然后我开始研究问题,发现在一些论坛上, INADDR_ANY (或0.0.0.0 )在Windows和Linux中有不同的含义: 在Linux中, 它意味着“侦听所有接口”并发送 – 通过默认接口发送 在Windows中, 它意味着“在默认界面上侦听” (第二个为0.0.0.1 )。 引用:“如果此成员指定IPv4地址为0.0.0.0,则使用默认的IPv4多播接口” – 而不提及是用于侦听还是用于发送。 你能否确认或否认? 如何真正在所有接口上听? 这是我的代码的一小部分: TMulticastListener = class(TThread) private mreq: ip_mreq; ………… end; constructor TMulticastListener.Create; var err: Integer; wData: WsaData; reuse: Integer; begin inherited Create(true); err := WSAStartup(MAKEWORD(2, 2), wData); if err = SOCKET_ERROR then begin // […]

C ++ Winsock接受内存泄漏/资源泄漏

我已经写了一个小testingTCP侦听器。 所述监听器监听端口28328并且工作得非常好,期望每当客户机连接到它时发生巨大的资源/内存泄漏。 #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") SOCKET Socket = INVALID_SOCKET; bool TestServer() { WSADATA wsaData = { 0 }; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) return false; sockaddr_in addr = { 0 }; Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int Enable = 1; setsockopt(Socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&Enable, sizeof(int)); addr.sin_family = AF_INET; addr.sin_port = htons(28328); […]

如何接收ip多播,只使用一个网卡

我有服务器与多个网卡,运行Windows Server 2003.我的应用程序接收组播数据包,但现在我需要从一个单一的networking接口接收组播数据包。 我认为这可以帮助,但我有一些问题。 ip_mreq mreq; mreq.imr_multiaddr.s_addr = multicast group address mreq.imr_interface.s_addr= network interface address if (setsockopt( socet , IPPROTO_IP , IP_ADD_MEMBERSHIP , (const void *)&mreq , sizeof(mreq)) < 0) { std::cerr << "setsockopt error" << std::endl; } 首先,我需要使用什么作为networking接口地址? networking接口的本地地址(与ipconfig的返回值相同)还是networking接口的索引,我可以使用GetAdaptersAddresses API函数获取? 其次,这是真的可能与Windows,或者我只是花时间? 更新我刚刚阅读了关于WSAJoinLeaf函数,我想知道,不可能只使用一个NIC进行多播。

如何处理multithreading服务器客户端程序中的数据包?

我目前有一个客户端应用程序,但它是单线程。 我的数据包看起来像这样:<len_of_data> | <data>“ “|” 被用作我的数据的分隔符。 <len_of_data>总是4位数字。 <data>看起来像:| <transaction id> | <command> | <buflen> | <buf> | <checksum> | 我的代码来创build数据包是: _snprintf_s(data_buffer, WS_MAX_DATA_PACKET_SIZE, WS_MAX_DATA_PACKET_SIZE – 1, "%s%d%s%d%s%d%s%s%s%d%s", WS_PACKET_SEP, pkt->transaction_id, WS_PACKET_SEP, pkt->command, WS_PACKET_SEP, pkt->bufsize, WS_PACKET_SEP, pkt->buf, WS_PACKET_SEP, pkt->checksum, WS_PACKET_SEP); buf_len = strlen(data_buffer); _snprintf_s(send_buffer, WS_MAX_DATA_PACKET_SIZE, WS_MAX_DATA_PACKET_SIZE – 1, "%04d%s%s", buf_len, WS_PACKET_SEP, data_buffer); buf_len = strlen(send_buffer); // Send buffer […]

在重叠套接字IO中处理错误

任何人都可以请build议一个可靠的方式来处理系统错误的情况下,使用重叠的套接字IO和IOCP? MSDN描述在这方面很麻烦。 它说GetQueuedCompletionStatus返回代码FALSE应该有一个后续GetLastError调用来获取失败的操作上的错误代码。 但是,我们知道,对于WSA函数,应该调用WSAGetLastError ( GetLastError在套接字错误时返回0)。 所以问题的第一部分是 – 它在实践中是如何工作的? 另一个问题是如果完成数据包由GetQueuedCompletionStatusEx提取,则处理错误。 MSDN只描述了这个调用本身的error handling,并没有提到获取单个失败操作的错误代码。 预先感谢所有回复和评论。

Socket编程C / C ++ – recv函数在服务器中挂起

我在使用recv函数时遇到问题 我有一个从客户端发送一些数据的应用程序,这些数据由服务器接收并根据数据发送响应。 当我发送less于16个请求时,实现工作正常。 但是,当我从客户端发送超过16个请求(一个接一个)时,从服务器到第16个请求的响应都没有问题,但在此之后服务器挂起。 我可以看到数据是从客户端传输,但没有被服务器接收。 我正在使用函数recv 接收发生在仅当从客户端接收到终止请求时退出的循环中。 服务器代码: // Request Winsock version 2.2 fprintf(stderr,"Performing WSAStartup\n"); if ((retval = WSAStartup(0x202, &wsaData)) != 0) { fprintf(stderr,"FAILED with error %d\n", retval); WSACleanup(); return -1; } else { printf("OK\n"); } if (port == 0) { Usage(argv[0]); } /* open socket connection */ printf("Opening socket\n"); local.sin_family = AF_INET; local.sin_addr.s_addr = […]

WINVER,winsock和htonl()

当我没有定义WINVER的时候,我的(msvc9)版本里面充满了警告,它说默认为0x0600(Vista),但是它的版本确定。 当我定义WINVER = 0x501(XP)时,我得到这个错误: – error C3861: 'htonl': identifier not found 我宁愿使用WINVER = 0x0501比0x0600,但我不知道如何解决它! 我注意到http://west-chamber-season-2.googlecode.com/svn-history/r2/trunk/wcs2_cli.c #ifdef WINVER #include <winsock.h> #else #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #endif 我需要做这样的事吗? 有任何想法吗?