Articles of winsock

BSD套接字兼容包装winsock?

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

在Win32中,有没有一种方法来testing套接字是否是非阻塞的?

在Win32中,有没有一种方法来testing套接字是否是非阻塞的? 在POSIX系统下,我会做如下的事情: int is_non_blocking(int sock_fd) { flags = fcntl(sock_fd, F_GETFL, 0); return flags & O_NONBLOCK; } 但是,Windows套接字不支持fcntl()。 非阻塞模式是使用ioctl和FIONBIO 设置的 ,但是似乎没有办法使用ioctl 获得当前的非阻塞模式。 有没有其他的Windows调用,我可以用它来确定套接字当前是否处于非阻塞模式?

当使用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; } […]

Windows DNS挂钩

Windows如何parsingDNS以及如何拦截呼叫,以注入我自己的域名? 我需要在一个应用程序中,并运行我自己的DNS服务器或修改hosts文件不是一个解决scheme。

Winsock recv在关机后不工作

我试图得到一个简单的winsock程序工作,所以我创build我的套接字,并发送我的数据就好了。 然后我使用根据msdn的shutdown(ConnectSocket, SD_SEND) ,禁止发送数据,但不接收? msdn的例子也是这样做的。 但是在我调用shutdown我的recv函数返回0而没有收到任何数据。 如果我注释掉closures代码,那么所有的东西都可以正常工作。 我错过了什么吗?

IO完成端口密钥混淆

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

closesocket线程安全吗?

如果我想从一个线程调用服务器套接字上的closesocket(),这与另一个使用相同服务器套接字运行服务器的线程是分开的,那么安全吗?

如何在Windows上select()中取消等待

在我的程序中,有一个线程(接收线程)负责接收来自TCP套接字的请求,并且有许multithreading(工作线程)负责处理接收到的请求。 一旦请求被处理,我需要通过TCP发送一个答案。 这是一个问题。 我想用与接收数据相同的线程发送TCP数据。 接收数据后的这个线程通常会等待select()新数据。 因此,一旦工作线程完成处理请求并在输出队列中input答案,它必须向接收线程发送有数据要发送的信号。 问题是,我不知道如何取消select()中的等待,以便退出等待并调用send() 。 或者我应该使用另一个线程来通过TCP发送数据? 更新 MSalters,Artyom谢谢你的回答! MSalters,阅读你的答案我发现这个网站: Winsock 2 I / O方法和阅读有关WSAWaitForMultipleEvents() 。 我的程序实际上必须在HP-UX和Windows上都能正常工作。我终于决定使用Artyom提出的方法。

IOCP AcceptEx不会在连接时创build完成

我目前正在尝试一些新的库(IOCP)进行套接字编程。 我偶然发现了AcceptExfunction来启用asynchronous连接。 正如文档所述: 与accept函数不同,AcceptEx函数使用重叠的I / O。 如果您的应用程序使用AcceptEx,它可以为相对较less的线程数量的大量客户端提供服务。 与所有重叠的Windows函数一样,可以使用Windows事件或完成端口作为完成通知机制。 但是,当客户端连接时,我不会完成任何完成。 当客户端发送数据时,我会完成。 这是我的代码: DWORD dwBytes; GUID GuidAcceptEx = WSAID_ACCEPTEX; int iResult = WSAIoctl(m_hSocket, SIO_GET_EXTENSION_FUNCTION_POINTER, &GuidAcceptEx, sizeof (GuidAcceptEx), &m_lpfnAcceptEx, sizeof (m_lpfnAcceptEx), &dwBytes, NULL, NULL); if (iResult == SOCKET_ERROR) { CloseSocket(); } 接着: WSAOVERLAPPED olOverlap; memset(&olOverlap, 0, sizeof (olOverlap)); char lpOutputBuf[1024]; int outBufLen = 1024; DWORD dwBytes; BOOL bRet […]

准确设置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 […]