c++ - 我可以在调用 WSAStartup() 之前创建一个套接字实例吗?

标签 c++ oop winsock2 wsastartup

我正在为 TCP/IP 网络客户端通信编写一个类。在类 header 中,我创建了一个 SOCKET 成员。该类还包含调用 WSAStartup 和检查版本的方法。建立连接的方法首先调用 WSAStartup,然后初始化调用 socket() 函数的 SOCKET 成员。请参阅下面的代码。 我想知道这是否“正确”,或者是否有更好的方法。

头文件:

/*network.h*/
public class IPnetwork
{
private:
    WSADATA wsaData ;
    SOCKET hSocket ;
    sockaddr_in socketAddress ;
    static const int SERVER_PORT = 502 ;
    unsigned long int = serverIP ;

public:
    IPnetwork(char* serverIPaddress) ;
    bool Connect() ;
    bool Disconnect() ;
    ~IPnetwork() ;

private:
    bool startWinSock() ;
} ;

源代码:

/*network.cpp*/
IPnetwork::IPnetwork(char* serverIPaddress)
{
    serverIP = inet_addr(serverIPaddress) ;
}

bool IPnetwork::Connect()
{
     /* start winsock */
    if(!startWinSock())
    {
        return false ; /* winsock problem */
    }

    /* Create socket */
    if ((hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
    {
        return false ; /* could not create socket */
    }

    /* fill socket address structure */
    socketAddress.sin_family = AFINET ;
    socketAddress.sin_port = htons(SERVER_PORT) ;
    socketAddress.sin_addr.S_un.S_addr = serverIP ;

    /* connect */
    if(connect(hSocket,reinterpret_cast<sockaddr*>(&socketAddress), sizeof(sockAddr))!=0)
    {
        return false ; /* could not connect*/
    }

    return true ;

}

bool IPnetwork::startWinSock()
{
    if(WSAStartup(MAKEWORD(REQ_WINSOCK_VER,0),&wsaData)==0)
    {
        /* Check if major version is at least REQ_WINSOCK_VER */
        if (LOBYTE(wsaData.wVersion) < REQ_WINSOCK_VER)
        {
            return false ; /* winsock started but version is too low */
        }
        else
        {
            return true ; /* winsock started with right version*/
        }
    }
    else
    {
        return false ; /* winsock not started */
    }

}

最佳答案

您担心定义类型为 SOCKET 的变量,以及它的构造函数何时运行?

这不是问题,因为 SOCKET 是 C 兼容的普通旧数据整数类型,它包含一个套接字标识符。它不是一个对象。没有与变量本身相关的重要构造或破坏。

关于c++ - 我可以在调用 WSAStartup() 之前创建一个套接字实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15343692/

相关文章:

c++ - 在 C 和 C++ 中使用 const 限定符指向数组的指针

c++ - Qt 自定义窗口

c++ - Winsock2 选择() : multiple events on the same socket is possible?

c++ - CreateProcessAsUser和createevent权限

c++ - C->C++ 在未给出类型的情况下,在#define 中自动将 void 指针转换为 C++ 中的类型指针(C 风格)[MSVS]

c++ - C++ 中的编译流程

Java 编译器忽略类型安全

c - 在c中的结构体中声明变量

python - 在评估定义为类的列表的长度时

c - 在这种情况下,我该如何使用char指针?(Windows中的SOCKET编程)