Connect()函数失败wsagetlasterror() 10038

connect() function fails wsagetlasterror() 10038

本文关键字:10038 wsagetlasterror 函数 Connect 失败      更新时间:2023-10-16

你好,我是一个初学者套接字/c程序员,从本教程中,我有连接函数返回10038错误。请帮助。我做错了什么?
还有winsock和winsock2的区别是什么?在connect()函数定义中也有int PASCALPASCAL是什么?

#include <iostream>
#include <winsock.h>

using namespace std;
 int main(){
    WSADATA wsa;
    cout<< "Iinitializing winsock....";
    SOCKET sa;
    struct sockaddr_in server;
        if (WSAStartup(MAKEWORD(2,2), &wsa)!=0)
            cout << "Failed";
    cout << "initialized";

        if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET))
            cout << "Could not create socket " << WSAGetLastError();
    cout << "Socket created";
    server.sin_addr.s_addr = inet_addr ("213.165.64.44");
    server.sin_family = AF_INET;
    server.sin_port = htons(7);
    //connect
        if (connect(sa, (struct sockaddr *)&server, sizeof(server)) < 0){
            cerr << "connect error" << WSAGetLastError();
            return 1;
        }
    cout << "connected";


return 0;
}

你应该看看文档10038是什么意思:

WSAENOTSOCK
10038 (0x2736)
An operation was attempted on something that is not a socket.

所以sa不是插座。将sa打印到cerr显示它为零,因此socket()函数调用周围的某些东西是坏的。更仔细地查看该行,可以发现该行中有一个括号错误:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) == INVALID_SOCKET))
首先执行

==,并且由于socket()函数的返回值不是无效套接字,因此将0分配给sa。正确的表达式应该是:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)

对于问题的其他部分:

  • winsock (winsock.dll)是v1.1的API, winsock2 (ws2_32.dll)是第二个版本,有许多改进。由于Win98以来它就是Windows的一部分(Win95可下载),我建议至少使用winsock2。
  • PASCAL__stdcall˙的宏,Windows API函数一般使用这种调用约定。