MS Windows套接字示例对我不起作用
MS Windows socket example not working for me
我正在尝试运行此处概述的Windows套接字示例。
在VS调试器中运行服务器代码,它在这里挂起accept()调用:
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
int __cdecl main(void)
{
WSADATA wsaData;
int iResult;
SOCKET ListenSocket = INVALID_SOCKET;
SOCKET ClientSocket = INVALID_SOCKET;
struct addrinfo *result = NULL;
struct addrinfo hints;
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %dn", iResult);
return 1;
}
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// Resolve the server address and port
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if ( iResult != 0 ) {
printf("getaddrinfo failed with error: %dn", iResult);
WSACleanup();
return 1;
}
// Create a SOCKET for the server to listen for client connections.
ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ldn", WSAGetLastError());
freeaddrinfo(result);
WSACleanup();
return 1;
}
// Setup the TCP listening socket
iResult = bind( ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR) {
printf("bind failed with error: %dn", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
freeaddrinfo(result);
iResult = listen(ListenSocket, SOMAXCONN);
if (iResult == SOCKET_ERROR) {
printf("listen failed with error: %dn", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
// Accept a client socket
ClientSocket = accept(ListenSocket, NULL, NULL); // *** blocks here ***
printf("accept completed!");
return 0;
}
我最初希望这能立即成功完成(但 fbidwell 解释了为什么情况并非如此)。
由于我很确定大约有一百万人成功运行了它,所以我猜这不是代码,所以它是我环境中的东西。我运行的是Windows 7,VS Community 2015。关于我应该检查哪些设置以使这个看似简单的示例工作的任何建议?
编辑:正如Remy Lebeau在他的评论中指出的那样,WSAECOND对我来说是一个红鲱鱼。 Fbidwell的解释回答了我的问题。
我也在为 .NET 4.5.2 构建,如果有帮助的话。
预计代码一旦到达accept()调用就会挂起,这是服务器等待客户端连接以继续的点。 您应该从此处编译示例客户端,并在服务器启动并运行后运行它。 一旦客户端命中 connect() 调用,您应该会看到接受返回。
相关文章:
- Windows.h 输入在函数之外不起作用
- C++Windows API MOUSEEVENTF_XDOWN,MOUSEEVENTF_XUP不起作用
- boost zlib filter 在 Windows 中不起作用
- 在 Windows 上打印不起作用
- Makefile在Linux中工作,但在Windows下不起作用,在子目录中找不到文件
- QClipboard的信号选择已更改在Windows 7中不起作用
- 当我在Windows上运行它时,为什么我的Linux编译二进制不起作用
- 提升协程是否在 Windows x86_64 上不起作用
- 唯一的字符代码在 Linux 中运行时不起作用,但在 Windows (C++) 中很好
- 在 Windows 8 中编译的 DLL 在 Windows 7 中不起作用
- Visual C 2012 Express Compied Application在Windows XP上不起作用
- MinGW .h 编译文件不起作用:此文件的版本与您运行的 Windows 版本不兼容
- outputdebugstring,printf不起作用(Visual Studio 2012,Windows 8)
- getenv( "LINES" ) 在 Windows 上不起作用
- EDSDK消息循环在Windows 8.1下不起作用
- 注入dll在windows XP上不起作用
- MS Windows套接字示例对我不起作用
- 在Windows 7下编译的Dll在Windows XP中不起作用
- 在 Windows 7 上中止系统关闭不起作用
- perl 内联 cpp 在 Windows 32 位上不起作用