【发布时间】:2016-04-11 19:19:24
【问题描述】:
我遇到了 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;
}
}
}
}
【问题讨论】:
-
不要以
__开头的变量命名,这是为实现保留的。 -
这是什么意思?
-
两个下划线开头的变量和函数名是保留的,你不能在自己的变量和函数中使用这些名称,以免发生冲突。
-
谢谢,以后不会用了
标签: c++ winapi network-programming