Reputation: 596
I am having a problem with the bind() and sendto() method which gives 10038 on WSAGetLastError(), which MSDN says invalid operation on socket. I cannot understand what is wrong with my code. I had tested my code on TCP and it was working but on UDP it is not working. I have seen other posts where people have had the same error, but its mostly a problem with socket closing. Thanks in advance.
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;
}
}
}
}
Upvotes: 0
Views: 205
Reputation: 310869
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
Precedence problem. It should be:
if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
Upvotes: 0
Reputation: 780788
This line is the problem:
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
It's setting __ping_server_socket
to the result of the comparison (true
or false
, which converts to the integers 1
or 0
), not to the value returned by socket()
. You need parentheses around the assignment to override the default operator precedence.
if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)
Upvotes: 1