I want to exit a blocking recv()
call. Based on this question, I should do the following:
shutdown(s, SD_RECEIVE);
But it is not working, recv()
is still blocking!
Edit:
This is the code I used:
#include <stdio.h>
#include <WinSock2.h>
#include <Windows.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")
unsigned int __stdcall recvThread(void *p)
{
SOCKET s = *((SOCKET*)p);
char buffer[2048];
int size;
do
{
size = recv(s, buffer, 2048, 0);
if (size > 0)
{
printf("Some data received\n");
}
else if (size == 0)
{
printf("Disconnected\n");
}
else
{
printf("Disconnected, error occured\n");
}
} while (size > 0);
return 0;
}
int main()
{
// Initialize Winsock
WSADATA wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
// Create socket
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
// Connect
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("192.168.1.4");
addr.sin_port = htons(atoi("12345"));
if (connect(s, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
{
printf("Unable to connect\n");
}
else
{
printf("Connected\n");
}
// Start recv() thread
HANDLE hRecvThread = (HANDLE)_beginthreadex(0, 0, recvThread, &s, 0, 0);
Sleep(3000);
// Exit blocking recv()
shutdown(s, SD_RECEIVE);
getchar();
return 0;
}