首页 > 解决方案 > 为什么我无法将我的套接字从阻塞更改为非阻塞?

问题描述

当我的 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;

}

标签: c++c

解决方案


所以你有一个错误代码。首先要做的是阅读文档:

10035:WSAEWOULDBLOCK。资源暂时不可用。此错误是从无法立即完成的非阻塞套接字上的操作返回的,

因此,您遇到的错误是拥有非阻塞套接字的直接结果。

您需要使用一些适当的等待功能,一旦它发出准备就绪信号,您可以完成连接操作。

https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-connect


推荐阅读