Articles of winsock2

是否有可能判断WSAStartup是否在进程中被调用?

我已经开始编写一个使用套接字的ActiveX控件。 使用此控件的应用程序可能也可能不会使用套接字。 是否可以让我的控制来判断WSAStartup是否被调用? 如果没有,就调用它。 一个小小的testing表明,多次调用WSAStartup是受到攻击的。 但是,如果要求不同的winsock版本,会发生什么? 这会打破应用程序的其他部分?

Winsock2 – 如何在客户端使用IOCP

我最近开始在Windows上学习IOCP,并阅读以下文章: http://www.codeproject.com/Tips/95363/Another-TCP-echo-server-using-IOCP 您可以从以下位置下载该文章的示例: http://dl.dropbox.com/u/281215/documentation/iocp-1.00.html 该示例包含两个简单的应用程序 – iocp_echo_server和TcpEchoClient 。 我知道IOCP通常用在客户端/服务器模型的服务器端,但是我想用IOCP创build一个客户端。 到目前为止,我已经尝试修改上面的客户端示例,以便每当服务器向客户端发送响应时,它都会自动拾取,但不起作用。 我已经离开了iocp_echo_server.c。 我的修改版本的TcpEchoClient.c如下所示: //TcpEchoClient.c – a minimalistic echo client // —————————————————————————– // C language includes #include <stdio.h> #include <winsock2.h> #include "mswsock.h" // for AcceptEx #include <stdlib.h> // exit #include <string.h> // Windows includes #include <windows.h> #pragma warning(disable: 4996) // sprintf // —————————————————————————– // configuration enum { […]

确定套接字和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: […]

如何在接受请求之前使用WSAConnect和WSAAccept发送接收的init数据

作为标题,我在MSDN或互联网上search了一个例子,但我没有find任何一个> _ < 所有使用WSAConnect的情况(S,sa,sa_len, NULL,NULL,NULL,NULL ); 我想使用这些函数(WSAConnect&WSAAccept)作为一个简单的权限,在接受前使用lpCallerData-> buf中的键 我已经尝试了从msdn的WSAAccept为服务器端的示例和我简单的代码有关WSAConnect,但它总是“lpCallerData == NULL” 对不起,我的英语不好 提前感谢您的帮助! 我不工作的代码: 服务器端: SOCKET SV_Socket; struct sockaddr_in SV_Channel; WORD SV_wVersionRequested; WSADATA SV_wsaData; int SV_on = 1; int CALLBACK ConditionAcceptFunc( LPWSABUF lpCallerId, LPWSABUF lpCallerData, LPQOS pQos, LPQOS lpGQOS, LPWSABUF lpCalleeId, LPWSABUF lpCalleeData, GROUP FAR * g, DWORD_PTR dwCallbackData ) { //printf( "test1\n" ); //if […]

将进程的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 […]

TCP打孔

我正在尝试使用mingw toolchain来实现使用Windows套接字的TCP打孔function。 我认为这个过程是正确的,但是这个洞似乎并不需要。 我用这个作为参考。 A和B连接到服务器S S发送到A , B的路由器IP +它用于连接到S的端口 S对B也是一样的 一开始2个线程: 一个线程尝试用S发送的信息连接到B的路由器 另一个线程正在等待连接到S时连接到路由器的同一个端口上的传入连接 B也是这样 自从我认为我在代码中没有问题: A和B确实得到彼此的IP和端口使用 当他们联系服务器时,他们都在监听他们用来连接路由器的端口 他们都连接到正确的IP和端口,但超时(代码错误10060 ) 我错过了什么? 编辑:在进程资源pipe理器的帮助下,我看到一个客户端设法build立到对等的连接。 但同行似乎并没有考虑要build立联系。 这是我用Wireshark捕获的。 为了举例,服务器S和客户端A在同一台PC上。 服务器S侦听redirect到该PC的特定端口( 8060 )。 B仍然尝试连接正确的IP,因为它看到由S发送的A的公共地址是localhost ,因此使用S的公共IP。 (我用占位符replace了公有IP地址) 编辑2 :我认为混乱是由于传入和传出连接请求数据传输在同一端口的事实。 这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据。 如果我引用msdn: SO_REUSEADDR套接字选项允许套接字强制绑定到另一个套接字使用的端口。 第二个套接字调用setsockopt,将optname参数设置为SO_REUSEADDR ,将optval参数设置为布尔值TRUE然后调用与原始套接字相同的端口上的绑定。 一旦第二个套接字成功绑定,绑定到该端口的所有套接字的行为是不确定的。 但是使用TCP Hole Punching技术来打开同一个端口是需要的!

Winsock2的fd 0(stdin)上的select()失败

使用Winsock2下面的代码序列为select()返回-1 (失败select() 。 #include <Winsock2.h> #include <stdio.h> … int rc; int fdstdin = fileno(stdin); /* returns 0 as expected */ fd_set fds; FD_ZERO(&fds); FD_SET(fdstdin, &fds); rc = select(1, &fds, NULL, NULL, NULL); … 这是使用Winsock2时的预期行为,还是我错过了一些东西?

为什么下面的代码会使我的电脑发出哔声?

我很难理解为什么这段代码会让我的电脑发出哔哔声。 我已经隔离了这段代码,是偶尔发出哔声的代码,但是我不知道它有什么问题。 const int BUFFER_LENGTH = 8192; char buffer [BUFFER_LENGTH + 1]; int recvResult; do { recvResult = recv(webSocket, buffer, BUFFER_LENGTH, 0); buffer[recvResult] = '\0'; printf("%s", buffer); if (recvResult > 0) { sendResult = send(clientSocket, buffer, recvResult, 0); } }while (recvResult > 0); shutdown(webSocket, SD_SEND); 为了给出一点上下文,这是一个计算机networking类,我们必须编写代理。 所以我在做的是听取答案,并简单地转发给客户。 当我第一次听到嗡嗡声时,我无法告诉你我跳出椅子有多高。