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

📄 nt_tcp_sockets.cpp

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 CPP
字号:
#include "nt_tcp_sockets.h"#include "nt_log.h"// Function name	: NT_Tcp_create_bind_socket// Description	    : // Return type		: int // Argument         : SOCKET *sock// Argument         : WSAEVENT *event// Argument         : int port// Argument         : unsigned long addrint NT_Tcp_create_bind_socket(SOCKET *sock, WSAEVENT *event, int port /*=0*/, unsigned long addr /*=INADDR_ANY*/){#ifdef USE_LINGER_SOCKOPT	struct linger linger;#endif	int optval, len;	// create the event	*event = WSACreateEvent();	if (*event == WSA_INVALID_EVENT)		return WSAGetLastError();	// create the socket	*sock = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);	if (*sock == INVALID_SOCKET)		return WSAGetLastError();	SOCKADDR_IN sockAddr;	memset(&sockAddr,0,sizeof(sockAddr));		sockAddr.sin_family = AF_INET;	sockAddr.sin_addr.s_addr = addr;	sockAddr.sin_port = htons((unsigned short)port);		if (bind(*sock, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)		return WSAGetLastError();#ifdef USE_LINGER_SOCKOPT	/* Set the linger on close option */	linger.l_onoff = 1 ;	linger.l_linger = 60;	setsockopt(*sock, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));#endif	len = sizeof(int);	if (!getsockopt(*sock, SOL_SOCKET, SO_RCVBUF, (char*)&optval, &len))	{	    optval = 32*1024;	    setsockopt(*sock, SOL_SOCKET, SO_RCVBUF, (char*)&optval, sizeof(int));	}	len = sizeof(int);	if (!getsockopt(*sock, SOL_SOCKET, SO_SNDBUF, (char*)&optval, &len))	{	    optval = 32*1024;	    setsockopt(*sock, SOL_SOCKET, SO_SNDBUF, (char*)&optval, sizeof(int));	}		return 0;}// Function name	: NT_Tcp_connect// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : char *host// Argument         : int portint NT_Tcp_connect(SOCKET sock, char *host, int port){	SOCKADDR_IN sockAddr;	memset(&sockAddr,0,sizeof(sockAddr));	sockAddr.sin_family = AF_INET;	sockAddr.sin_addr.s_addr = inet_addr(host);	if (sockAddr.sin_addr.s_addr == INADDR_NONE)	{		LPHOSTENT lphost;		lphost = gethostbyname(host);		if (lphost != NULL)			sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;		else		{			return WSAEINVAL;		}	}	sockAddr.sin_port = htons((u_short)port);	DWORD error;	int reps = 0;	while (connect(sock, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)	{		error = WSAGetLastError();		if( (error == WSAECONNREFUSED || error == WSAETIMEDOUT || error == WSAENETUNREACH || error == WSAEADDRINUSE)			&& (reps < 15) )		{			double d = (double)rand() / (double)RAND_MAX;			Sleep(200 + (int)(d*200));			reps++;			switch (error)			{			case WSAECONNREFUSED:			    LogMsg("WSAECONNREFUSED error, re-attempting connect");			    break;			case WSAETIMEDOUT:			    LogMsg("WSAETIMEDOUT error, re-attempting connect");			    break;			case WSAENETUNREACH:			    LogMsg("WSAENETUNREACH error, re-attempting connect");			    break;			case WSAEADDRINUSE:			    LogMsg("WSAEADDRINUSE error, re-attempting connect");			    break;			default:			    LogMsg("%d error, re-attempting connect");			    break;			}		}		else		{			MakeErrMsg(error, "Unable to connect to %s on port %d", host, port);			break;		}	}	return 0;}// Function name	: NT_Tcp_closesocket// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : WSAEVENT eventint NT_Tcp_closesocket(SOCKET sock, WSAEVENT event){	shutdown(sock, SD_BOTH);	closesocket(sock);	if (event)		WSACloseEvent(event);	return 0;}// Function name	: NT_Tcp_get_sock_info// Description	    : // Return type		: int // Argument         : SOCKET sock// Argument         : char *name// Argument         : int *portint NT_Tcp_get_sock_info(SOCKET sock, char *name, int *port){	sockaddr_in addr;	int name_len = sizeof(addr);	getsockname(sock, (sockaddr*)&addr, &name_len);	*port = ntohs(addr.sin_port);	gethostname(name, 100);	return 0;}// Function name	: NT_Tcp_get_ip_string// Description	    : // Return type		: int // Argument         : char *host// Argument         : char *ipstrint NT_Tcp_get_ip_string(char *host, char *ipstr){    unsigned int a, b, c, d;    struct hostent *pH;        pH = gethostbyname(host);    if (pH == NULL)	return FALSE;    a = (unsigned char)(pH->h_addr_list[0][0]);    b = (unsigned char)(pH->h_addr_list[0][1]);    c = (unsigned char)(pH->h_addr_list[0][2]);    d = (unsigned char)(pH->h_addr_list[0][3]);    sprintf(ipstr, "%u.%u.%u.%u", a, b, c, d);    return TRUE;}

⌨️ 快捷键说明

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