Articles of winsock

关于Winsock Kernel Buffer和Naglealgorithm的疑问

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

准确设置winsockselect超时

我试图让我的接受呼叫在特定的时间段后超时,我试着在这里的build议: Winsock接受超时 在这种情况下,我传递一个TIMEVAL结构来select当我打电话时,问题是当我设置tv.tv_usec约40分钟左右,select呼叫立即超时,而不是等待我指定的40分钟。 MSDN指出,select的超时是它将等待的最长时间,我该如何使select或receive在这个超时之前等待特定的时间? #define WIN32_LEAN_AND_MEAN #include <Windows.h> #include <WinSock2.h> #include <Ws2tcpip.h> #include <cstdio> #include <tchar.h> VOID _tmain( int argc, TCHAR *argv[] ) { WSADATA wsaData = { 0 }; ADDRINFOA hINTs = { 0 }; PADDRINFOA pResult = NULL; SOCKET hServerSocket = INVALID_SOCKET, hClientSocket = INVALID_SOCKET; TIMEVAL tv = { 0 }; INT iReturnStatus […]

通过同一台机器上的UDP套接字发送数据是否可靠?

如果我使用UDP套接字进行进程间通信,我可以期望所有发送数据都被其他进程以相同的顺序接收吗? 一般来说,我知道这不是真的。

将进程的IOredirect到Windows套接字

我是新的winsock,我试图写一个服务器套接字,接受新的连接,然后它调用一个外部的可执行文件。 我们如何将外部可执行文件的stdin和stdoutredirect到已被接受的客户端套接字。 我GOOGLE了,发现下面的代码,但它不工作。 新进程已成功创build,但客户端无法从新进程接收任何数据。 我正在使用Windows 7和Visual Studio 2008 Express版本。 任何帮助和意见表示赞赏。 非常感谢! 服务器 #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #pragma comment(lib, "Ws2_32.lib") #define DEFAULT_PORT "27015" #define DEFAULT_BUFLEN 512 int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; int iResult; // Initialize Winsock iResult = WSAStartup(MAKEWORD(2,2), &wsaData); struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof […]

WinSock.h和WinSock2.h哪个使用?

有谁知道WinSock.h和WinSock2.h之间的区别。 我知道他们不使用相同的库(.lib),但我不知道如果WinSock2只增加了新的function,或者如果它也提高了WinSock 1function。 我正在使用IP / TCP套接字,并想用select()来pipe理超时。 我也使用多个线程同时pipe理多个客户端。 我应该继续使用WinSock 1.1还是移动到WinSock 2? 提前致谢。

Winsock返回10061仅连接到本地主机

我不明白发生了什么事。 如果我创build一个套接字到localhost以外的地方(“localhost”,“127.0.0.1”或机器的外部ip),它可以正常工作。 如果我创build一个套接字到一个地址没有听到的端口,我会得到一个10060(超时),而不是10061是有道理的。 为什么当我到本地主机时,连接被拒绝? 我试图禁用防火墙,以防万一它搞砸了,但事实并非如此 在此之前,我正在做所有的WSA初始化工作。 _socketToServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(_socketToServer == -1){ return false; } p_int = (int*)malloc(sizeof(int)); *p_int = 1; if( (setsockopt(_socketToServer, SOL_SOCKET, SO_REUSEADDR, (char*)p_int, sizeof(int)) == -1 )|| (setsockopt(_socketToServer, SOL_SOCKET, SO_KEEPALIVE, (char*)p_int, sizeof(int)) == -1 ) ){ free(p_int); return false; } free(p_int); struct sockaddr_in my_addr; my_addr.sin_family = AF_INET ; my_addr.sin_port = […]

当使用Winsock读取所有信息时,结束“recv()”循环

我在winsock的recv()循环中遇到问题。 我试图在iResult == 0时终止循环,但是,循环仅在套接字closures时结束。 它似乎挂在最后recv()哪里iResult将等于0.所以任何想法如何有效地终止循环? 我的最终目标(无论是否iResult == 0,也许我是这样做的错误方式)是当所有发送的信息被读取时停止循环。 这是循环。 do { iResult = recv(socket, recvbuf, BUFLEN-1, 0); if(iResult > 0){ // Null byte 🙂 // Remove that garbage >:( recvbuf[iResult] = '\0'; printf("Recvbuf: %s\n\n\niResult: %d\n",recvbuf,iResult); continue; // working properly } else if(iResult == 0) // Connection closed properly break; else { printf("ERROR! %ld",WSAGetLastError()); break; } […]

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 […]

IO完成端口密钥混淆

我正在使用ctypes模块在Python中使用Windows DLL API编写基于IO完成端口的服务器( 源代码 )。 但这是对API的直接使用,这个问题针对那些掌握IOCP知识的人,而不是Python。 正如我理解的CreateIoCompletionPort的文档,你指定你的“用户定义的”完成键,当你用一个文件句柄(在我的情况下是一个套接字)与创build的IOCP关联调用此函数。 当你开始调用GetQueuedCompletionStatus时,你会得到一个完成键值和一个指向重叠对象的指针。 完成键应该确定重叠的对象和请求已经完成。 但是,假设我在CreateIoCompletionPort调用中使用重叠对象传入100作为完成键。 当相同的重叠对象的IO完成并且通过GetQueuedCompletionStatus返回时,它所附带的完成键要大得多,并且与原始值100毫不相似。 我误解完成密钥是如何工作的,还是我在上面链接的源代码中做错了?

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

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