Connect()函数失败wsagetlasterror() 10038
connect() function fails wsagetlasterror() 10038
你好,我是一个初学者套接字/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函数一般使用这种调用约定。
相关文章:
- 包含线程后C++套接字错误WSAENOTSOCK (10038)
- 在我的代码中出现这个"10038 wsa socket"错误
- 关机失败,出现错误 10038
- 绑定方法给出错误10038(WSAENOTSOCK)
- Winsock选择错误10038,绑定和侦听成功
- C++ Winsock 在 bind() 上给出 10038 错误
- WSAGetLastError 10038 in a C++ client
- C++套接字编程:sendto()和recvfrom()错误代码10038和in 'server'绑定失败,10038
- 检测到FD_ACCEPT,但随后调用'accept'失败,并显示 10038 - WSAENOTSOCK
- C++Winsock套接字错误:10038(WSAENOTSOCK)
- Connect()函数失败wsagetlasterror() 10038
- MFC CSocket返回错误码10038