绑定方法给出错误10038(WSAENOTSOCK)
bind method giving error of 10038 (WSAENOTSOCK)
我的bind()和sendto()方法有问题,该方法在WSAGetLastError()上给出10038,MSDN称其在套接字上的操作无效。我无法理解我的代码出了什么问题。我在TCP上测试了我的代码,它可以工作,但在UDP上不工作。我在其他帖子中也看到过同样的错误,但主要是套接字关闭的问题。提前谢谢。
int socket_func :: udpRelayCheck()
{
WSADATA __wsaData;
WORD __version = WSAStartup(MAKEWORD(2, 2), &__wsaData);
if (__version != 0)
{
WSACleanup();
return 1;
}
SOCKET __ping_server_socket;
sockaddr_in __ping_server_service;
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
{
WSACleanup();
return 2;
}
memset((void*)&__ping_server_service, 0, sizeof(__ping_server_service));
__ping_server_service.sin_family = AF_INET;
__ping_server_service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
__ping_server_service.sin_port = htons(55555);
int __ping_server_service_length = sizeof(__ping_server_service);
char *__relayMessage = "connect";
char __recvBuff[200] = "";
char *__check_buffer = "star";
if (bind(__ping_server_socket, (struct sockaddr *)&__ping_server_service, sizeof(__ping_server_service)) == INVALID_SOCKET)
{
cout << WSAGetLastError() << endl;
return -1;
}
while (1)
{
if (sendto(__ping_server_socket, __relayMessage,strlen(__relayMessage), 0, (struct sockaddr *)&__ping_server_service, __ping_server_service_length) == SOCKET_ERROR)
{
cout << WSAGetLastError() << endl;
return -1;
}
if (recvfrom(__ping_server_socket, __recvBuff, strlen(__recvBuff), 0, (SOCKADDR*)& __ping_server_service, &__ping_server_service_length) != SOCKET_ERROR)
{
if (strcmp(__check_buffer, __recvBuff) == 0)
{
__global_udp_relay_socket = __ping_server_socket;
__global_udp_relay_sockaddr = __ping_server_service;
WSACleanup();
return 0;
}
}
}
}
这一行就是问题所在:
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
它将__ping_server_socket
设置为比较结果(true
或false
,转换为整数1
或0
),而不是socket()
返回的值。您需要在赋值周围使用括号来覆盖默认的运算符优先级。
if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
先例问题。应该是:
if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
相关文章:
- WSAPolll 更改 FDSET 中的数据,并返回由于 WSAENOTSOCK 而导致的错误.我是否正确使用 WSAP
- 包含线程后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)
- 为什么我在这段代码中得到WSAENOTSOCK错误?
- Connect()函数失败wsagetlasterror() 10038
- MFC CSocket返回错误码10038