c++ - 为什么我无法将我的套接字从阻塞更改为非阻塞?
问题描述
当我的 connect() 函数调用我的套接字进入非阻塞模式后出现 10035 连接错误?我的代码应该没有那个错误。有人告诉我为什么会这样吗?
#include <stdio.h>
#include <winsock2.h>
#include <windows.h>
#include <string.h>
#include <iostream>
#include <string>
#include <stdio.h>
#pragma comment(lib,"ws2_32.lib") //Winsock Library
#pragma comment(lib,"ws2_32")
using namespace std;
const int arrsize = 1;
int main(int argc , char **argv)
{
//Declare WSADATA structure containing information about windows sockets implementation.
WSADATA wsa;
//Create a socket object
SOCKET s;
struct sockaddr_in server;
const char *message;
char server_reply[arrsize];
int recv_size;
//Create socket.
cout << "Creating socket for connection." << endl;
if((s = socket(AF_INET , SOCK_STREAM , 0)) == INVALID_SOCKET)
{
printf("Could not create socket : %d" , WSAGetLastError());
}
就在这儿。为什么我的 connect() 函数总是出错?错误是 10035。我正在尝试使我的套接字成为非阻塞模式。
u_long mode = 1; //For nonblocking mode.
ioctlsocket(s, FIONBIO, &mode);
char address[100] = "172.217.23.36";
server.sin_addr.s_addr = inet_addr(address);
server.sin_family = AF_INET;
server.sin_port = htons( 80 );
//Establish connection.
if ( connect(s, (struct sockaddr *)&server , sizeof(server)) < 0 )
{
puts("Function connect() did not connect.");
printf ( " %d", WSAGetLastError() );
return 1;
}
message = "GET / HTTP/1.1 \r\n\r\n";
if( send(s , message , strlen(message)+1, 0) < 0)
{
puts("Function send() failed.");
return 1;
}
if ( (recv_size = recv(s , server_reply , arrsize, 0)) == SOCKET_ERROR )
{
puts("Function recv failed.");
return 1;
}
closesocket(s);
//Terminate use of Winsock 2 DLL by calling WSACleanup() function.
WSACleanup();
return 0;
}
解决方案
所以你有一个错误代码。首先要做的是阅读文档:
10035:WSAEWOULDBLOCK。资源暂时不可用。此错误是从无法立即完成的非阻塞套接字上的操作返回的,
因此,您遇到的错误是拥有非阻塞套接字的直接结果。
您需要使用一些适当的等待功能,一旦它发出准备就绪信号,您就可以完成连接操作。
https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect
推荐阅读
- powershell - 如何为 Microsoft 365/AzureAD/Exchange Online 自动化的 powershell 脚本进行身份验证?
- google-compute-engine - 实例组:资源“us-instance-group-1”超过限制“QUOTA_FOR_INSTANCES”。限制:8.0
- javascript - 会话存储值未显示在第二页中
- c# - 过滤除一个以外的所有控制器的 .net 核心
- python - 排序函数
- python - Pandas 使用字典追加行以某种方式为某些新字典项添加列
- c++ - vscode c++调试器包含路径配置
- swift - 使用大导航标题时如何使视图居中?
- amazon-web-services - Lambda Resource-Based Policy 中 principal 和 source-account 的区别
- swift - 使用未解析的标识符 'FUIEmailAuth'FUIEmailAuth