#ifdef _DEBUG
#define GMT_ASSERT(exp) assert(exp) #else #define GMT_ASSERT(exp) #endif
#define PORT 5150
#define DATA_BUFSIZE 8192
// Overlapped event.
#define RECV_WSAEVENT 0 #define SEND_WSAEVENT 1 #define CTRL_IOTHREAD_WSAEVENT 2 #define WSAEVENT_COUNT 3
// Index of thread type.
#define SEND_THREAD 0 #define IO_THREAD 1 #define THREAD_COUNT 2
typedef struct _SOCKET_INFORMATION {
char szIOBuffer[DATA_BUFSIZE]; WSABUF DataBuf; WSAOVERLAPPED Overlapped; DWORD BytesSEND; DWORD BytesRECV; } SOCKET_INFORMATION, * LPSOCKET_INFORMATION;
SOCKET ClientSocket;
DWORD EventTotal = 0; HANDLE hThread[THREAD_COUNT]; WSAEVENT EventArray[WSAEVENT_COUNT]; LPSOCKET_INFORMATION g_pSIRecv = NULL; LPSOCKET_INFORMATION g_pSISend = NULL;
void CloseClientSocket()
{ if (INVALID_SOCKET != ClientSocket) { if (closesocket(ClientSocket) == 0) ClientSocket = INVALID_SOCKET; } }
// Deliver recv operation.
int RecvData() { if (NULL == g_pSIRecv || INVALID_SOCKET == ClientSocket) return FALSE;
DWORD dwFlags = 0;
g_pSIRecv->BytesRECV = 0; memset(g_pSIRecv->szIOBuffer, 0, sizeof(g_pSIRecv->szIOBuffer)); g_pSIRecv->DataBuf.len = sizeof(g_pSIRecv->szIOBuffer)-1; int nRet = WSARecv(ClientSocket, &(g_pSIRecv->DataBuf), 1, &g_pSIRecv->BytesRECV, &dwFlags, &(g_pSIRecv->Overlapped), NULL); if (nRet == SOCKET_ERROR) { if (WSAGetLastError() != ERROR_IO_PENDING) { printf("WSARecv() failed with error %d/n", WSAGetLastError()); CloseClientSocket(); return FALSE; } }
return TRUE;
}
// Deliver send operation.
BOOL SendData() { if (NULL == g_pSIRecv || INVALID_SOCKET == ClientSocket) return FALSE;
g_pSISend->BytesSEND = 0;
strcpy(g_pSISend->szIOBuffer, "this is client data."); g_pSISend->DataBuf.len = strlen(g_pSISend->szIOBuffer); int nRet = WSASend(ClientSocket, &(g_pSISend->DataBuf), 1, &g_pSISend->BytesSEND, 0, &(g_pSISend-&g |