⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 recv_blocking.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
字号:
#include "sockets.h"#include <stdio.h>// Function name	: ReceiveBlocking// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : WSAEVENT event// Argument         : char *buffer// Argument         : int len// Argument         : int flagsint ReceiveBlocking(SOCKET sock, WSAEVENT event, char *buffer, int len, int flags){	int num_received, error;	WSANETWORKEVENTS nevents;	DWORD ret_val;		num_received = recv(sock, buffer, len, flags);	if (num_received == SOCKET_ERROR)	{		error = WSAGetLastError();		if (error != WSAEWOULDBLOCK)			return error;	}	else	{		len -= num_received;		buffer += num_received;	}	while (len)	{			//if (WSAWaitForMultipleEvents(1, &event, TRUE, INFINITE, FALSE) != WSA_WAIT_EVENT_0)		//if (WSAWaitForMultipleEvents(1, &event, TRUE, 3000, FALSE) != WSA_WAIT_EVENT_0)		//	return WSAGetLastError();		//ret_val = WSAWaitForMultipleEvents(1, &event, TRUE, 3000, FALSE);		ret_val = WSAWaitForMultipleEvents(1, &event, TRUE, INFINITE, FALSE);		if (ret_val == WSA_WAIT_FAILED)			return WSAGetLastError();		if (ret_val != WSA_WAIT_EVENT_0)			return ret_val;		if (WSAEnumNetworkEvents(sock, event, &nevents) == SOCKET_ERROR)			return WSAGetLastError();		if (nevents.lNetworkEvents & FD_READ)		{			num_received = recv(sock, buffer, len, flags);			if (num_received == SOCKET_ERROR)			{				error = WSAGetLastError();				if (error != WSAEWOULDBLOCK)					return error;			}			else			{				len -= num_received;				buffer += num_received;			}		}		else		{			if (nevents.lNetworkEvents & FD_CLOSE)				return 1;		}	}	return 0;}// Function name	: ReceiveBlockingTimeout// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : WSAEVENT event// Argument         : char *buffer// Argument         : int len// Argument         : int flags// Argument         : int timeoutint ReceiveBlockingTimeout(SOCKET sock, WSAEVENT event, char *buffer, int len, int flags, int timeout){	int num_received, error;	WSANETWORKEVENTS nevents;	DWORD ret_val;		num_received = recv(sock, buffer, len, flags);	if (num_received == SOCKET_ERROR)	{		error = WSAGetLastError();		if (error != WSAEWOULDBLOCK)			return error;	}	else	{		len -= num_received;		buffer += num_received;	}	while (len)	{		ret_val = WSAWaitForMultipleEvents(1, &event, TRUE, timeout, FALSE);		if (ret_val == WSA_WAIT_FAILED)			return WSAGetLastError();		if (ret_val != WSA_WAIT_EVENT_0)			return ret_val;		if (WSAEnumNetworkEvents(sock, event, &nevents) == SOCKET_ERROR)			return WSAGetLastError();		if (nevents.lNetworkEvents & FD_READ)		{			num_received = recv(sock, buffer, len, flags);			if (num_received == SOCKET_ERROR)			{				error = WSAGetLastError();				if (error != WSAEWOULDBLOCK)					return error;			}			else			{				len -= num_received;				buffer += num_received;			}		}		else		{			if (nevents.lNetworkEvents & FD_CLOSE)				return 1;		}	}	return 0;}// Function name	: ReceiveSomeBlocking// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : WSAEVENT event// Argument         : char *buffer// Argument         : int *len// Argument         : int flagsint ReceiveSomeBlocking(SOCKET sock, WSAEVENT event, char *buffer, int *len, int flags){	int num_received = 0, error;	WSANETWORKEVENTS nevents;	DWORD ret_val;		num_received = recv(sock, buffer, *len, flags);	if (num_received == SOCKET_ERROR)	{		error = WSAGetLastError();		if (error != WSAEWOULDBLOCK)			return error;	}	else	{		*len = num_received;		if (num_received == 0)			return 1;		return 0;	}	while (true)	{		ret_val = WSAWaitForMultipleEvents(1, &event, TRUE, INFINITE, FALSE);		if (ret_val == WSA_WAIT_FAILED)			return WSAGetLastError();		if (ret_val != WSA_WAIT_EVENT_0)			return ret_val;		if (WSAEnumNetworkEvents(sock, event, &nevents) == SOCKET_ERROR)			return WSAGetLastError();		if (nevents.lNetworkEvents & FD_READ)		{			num_received = recv(sock, buffer, *len, flags);			if (num_received == SOCKET_ERROR)			{				error = WSAGetLastError();				if (error != WSAEWOULDBLOCK)					return error;			}			else			{				*len = num_received;				if (num_received == 0)					return 1;				return 0;			}		}		else		{			if (nevents.lNetworkEvents & FD_CLOSE)				return 1;		}	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -