gpt4 book ai didi

c++ - connect() 函数失败 wsagetlasterror() 10038

转载 作者:行者123 更新时间:2023-11-28 00:50:34 32 4
gpt4 key购买 nike

你好,我是一名初学者 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;
}

最佳答案

你应该看看文档 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 .

关于c++ - connect() 函数失败 wsagetlasterror() 10038,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14289998/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com