【问题标题】:connect() function fails wsagetlasterror() 10038connect() 函数失败 wsagetlasterror() 10038
【发布时间】:2014-05-01 17:48:26
【问题描述】:

您好,我是初学者 socket/c 程序员,从本教程中我有连接函数返回 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;
}

【问题讨论】:

    标签: c++ winsock


    【解决方案1】:

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

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

    对于问题的其他部分:

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

    【讨论】:

    • +1 为您的答案 - 我永远不会费心仔细观察。 -1 用于垃圾调试技能的 OP 问题 - 不首先将套接字读入本地,以便检查其返回值。对不起,OP,但是这个网站上显示的调试技能水平非常糟糕,而且越来越差......
    • 所以你是在告诉我我的调试技巧很差,而你自己却没有发现它?顺便说一句,我确实使用 wsagetlasterror 查找了错误代码。我只是不知道是什么原因造成的。
    • 您还推荐什么ide?我目前正在使用 code::blocks,我应该更改 ides 吗?
    • @KelvinSilva - 我什至懒得仔细查看代码。我会在 15 分钟内调试并修复它。对不起,如果我让你有点生气,但我坚持我的原点 - 调试似乎正在成为一种失传的艺术。使用调试器,简化复杂的行,提出一些额外的局部变量,将复杂的问题分解到中间。
    • @MartinJames 他确实说过他是 C 的初学者。在学习时寻求帮助是一件好事——所以要友善。我确定您曾经需要寻求帮助?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2017-06-20
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多