C++ connect()函数失败wsagetlasterror()10038

C++ connect()函数失败wsagetlasterror()10038,c++,winsock,C++,Winsock,您好,我是一名初学者socket/c程序员,在本教程中,我有一个connect函数返回10038错误。请帮忙。我做错了什么? winsock和winsock2有什么区别? 在connect()函数定义中还有int PASCAL 帕斯卡是干什么的 #include <iostream> #include <winsock.h> using namespace std; int main(){ WSADATA wsa; cout<< "I

您好,我是一名初学者socket/c程序员,在本教程中,我有一个connect函数返回10038错误。请帮忙。我做错了什么?
winsock和winsock2有什么区别? 在connect()函数定义中还有int PASCAL 帕斯卡是干什么的

#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;
}
#包括
#包括
使用名称空间std;
int main(){
WSADATA wsa;

cout您应该查看文档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()
函数的返回值不是无效的socket,因此将零分配给sa。 正确的表达应该是:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
关于问题的其他部分:

  • winsock(winsock.dll)是API的v1.1版本,winsock2(ws2_32.dll)是第二个有很多改进的版本。由于它是Windows的一部分,从Win98开始(可用于Win95下载),我建议至少使用winsock2
  • PASCAL
    是用于
    \uu stdcall
    ˙的宏,Windows API函数通常使用此宏

您应该查看文档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()
函数的返回值不是无效的socket,因此将零分配给sa。 正确的表达应该是:

if ((sa = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
关于问题的其他部分:

  • winsock(winsock.dll)是API的v1.1版本,winsock2(ws2_32.dll)是第二个有很多改进的版本。由于它是Windows的一部分,从Win98开始(可用于Win95下载),我建议至少使用winsock2
  • PASCAL
    是用于
    \uu stdcall
    ˙的宏,Windows API函数通常使用此宏

+1为您的答案-我从来不会费心这么仔细地看。-1为废话调试技能的OP问题-不先将套接字读入本地以便检查其返回值。抱歉,OP,但此网站上显示的调试技能水平非常差,而且越来越差…所以您是在告诉我我调试不好当你自己不会发现它的时候,你会使用ng技巧吗?顺便说一句,我确实用wsagetlasterror查找了错误代码。我只是不知道是什么原因造成的。还有,你会推荐什么ide?我目前正在使用code::blocks,我应该更改ide吗?@KelvinSilva-我甚至懒得仔细查看代码。我会调试它,并用15分钟后。对不起,如果我让你有点恼火,但我坚持我的观点-调试似乎正在成为一门失去的艺术。使用调试器,简化复杂的行,提出一些额外的局部变量,将复杂的问题从中间分割开。@MartinJames他确实说过他是C的初学者。在学习时寻求帮助是一件好事-所以要友善。我相信你一定有一段时间需要寻求帮助?+1是你的答案-我从来不会费心仔细看。-1是关于糟糕调试技能的OP问题-没有先将套接字读入本地以便检查其返回值。对不起,OP,但是这个网站上显示的调试技能水平非常糟糕,而且越来越差更糟糕的是…所以你是说我的调试技能很差,而你自己却没有发现?顺便说一句,我确实用wsagetlasterror查找了错误代码。我只是不知道是什么原因造成的。还有,你会推荐什么ide?我目前正在使用code::blocks,我应该更改ide吗?@KelvinSilva-我甚至懒得仔细查看code.我会在15分钟内调试并修复它。抱歉,如果我让你有点恼火,但我坚持我的原意-调试似乎正在成为一门失去的艺术。使用调试器,简化复杂的行,提出一些额外的局部变量,将复杂的问题从中间分割出去。@MartinJames He确实说过他是C的初学者。什么时候寻求帮助你在学习是一件好事,所以要友善。我肯定你有一段时间不得不寻求帮助?