0

您好,我是初学者 socket/c 程序员,从本教程中我有连接函数返回 10038 错误。请帮忙。我究竟做错了什么?
还有winsock和winsock2有什么区别?在 connect() 函数定义中还有 int PASCAL 什么是 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;
}
4

1 回答 1

3

您应该查看文档 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 函数一般使用这种调用约定
于 2013-01-12T13:49:18.147 回答