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

📄 bsockets.c

📁 MPICH是MPI的重要研究,提供了一系列的接口函数,为并行计算的实现提供了编程环境.
💻 C
📖 第 1 页 / 共 3 页
字号:
		break;	    }	}	else	{	    return SOCKET_ERROR;	}#else	if( (errno == ECONNREFUSED || errno == ETIMEDOUT || errno == ENETUNREACH)	    && (reps < 10) )	{#ifdef HAVE_USLEEP	    usleep(200);#else	    sleep(0);#endif	    reps++;	}	else	{	    return SOCKET_ERROR;	}#endif    }    /* Set the linger on close option */    linger.l_onoff = 1 ;    linger.l_linger = 60;    bsetsockopt(bfd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));    return 0;}/*@   beasy_connect - connect   Parameters:+  int bfd - bsocket.  char *host - hostname.  int port - port-  int seconds - timeout value in seconds   Notes:@*/int beasy_connect_timeout(int bfd, char *host, int port, int seconds){#ifdef HAVE_WINSOCK2_H    BOOL b;#endif    clock_t start, current;    int error;    int reps = 0;    struct hostent *lphost;    struct sockaddr_in sockAddr;#ifdef USE_LINGER_SOCKOPT    struct linger linger;#endif#ifdef HAVE_WINSOCK2_H    /* use this array to make sure the warning only gets logged once */    BOOL bWarningLogged[4] = { FALSE, FALSE, FALSE, FALSE };#endif    start = clock();    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 || sockAddr.sin_addr.s_addr == 0)    {	lphost = gethostbyname(host);	if (lphost != NULL)	    sockAddr.sin_addr.s_addr = ((struct in_addr *)lphost->h_addr)->s_addr;	else	    return SOCKET_ERROR;    }        sockAddr.sin_port = htons((u_short)port);        while (bconnect(bfd, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR)    {	current = clock();	if (((current - start) / CLOCKS_PER_SEC) > seconds)	{#ifdef HAVE_WINSOCK2_H	    WSASetLastError(WSAETIMEDOUT);#endif	    return SOCKET_ERROR;	}#ifdef HAVE_WINSOCK2_H	error = WSAGetLastError();	srand(clock());	if( (error == WSAECONNREFUSED || error == WSAETIMEDOUT || error == WSAENETUNREACH || error == WSAEADDRINUSE)	    && (reps < g_beasy_connection_attempts) )	{	    double d = (double)rand() / (double)RAND_MAX;	    Sleep(200 + (int)(d*200));	    reps++;	    switch (error)	    {	    case WSAECONNREFUSED:		if (!bWarningLogged[0])		{		    /*log_warning("WSAECONNREFUSED error, re-attempting bconnect(%s)", host);*/		    bWarningLogged[0] = TRUE;		}		break;	    case WSAETIMEDOUT:		if (!bWarningLogged[1])		{		    log_warning("WSAETIMEDOUT error, re-attempting bconnect(%s)", host);		    bWarningLogged[1] = TRUE;		}		break;	    case WSAENETUNREACH:		if (!bWarningLogged[2])		{		    log_warning("WSAENETUNREACH error, re-attempting bconnect(%s)", host);		    bWarningLogged[2] = TRUE;		}		break;	    case WSAEADDRINUSE:		if (!bWarningLogged[3])		{		    log_warning("WSAEADDRINUSE error, re-attempting bconnect(%s)", host);		    bWarningLogged[3] = TRUE;		}		break;	    default:		log_warning("%d error, re-attempting bconnect");		break;	    }	}	else	{	    return SOCKET_ERROR;	}#else	if( (errno == ECONNREFUSED || errno == ETIMEDOUT || errno == ENETUNREACH)	    && (reps < g_beasy_connection_attempts) )	{#ifdef HAVE_USLEEP	    usleep(200);#else	    sleep(0);#endif	    reps++;	}	else	{	    return SOCKET_ERROR;	}#endif    }#ifdef USE_LINGER_SOCKOPT    /* Set the linger on close option */    linger.l_onoff = 1 ;    linger.l_linger = 60;    bsetsockopt(bfd, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));#endif#ifdef HAVE_WINSOCK2_H    b = TRUE;    bsetsockopt(bfd, IPPROTO_TCP, TCP_NODELAY, (char*)&b, sizeof(BOOL));#endif    return 0;}/*@   beasy_accept - accept   Parameters:.  int bfd - listening bsocket   Notes:@*/int beasy_accept(int bfd){#ifdef HAVE_WINSOCK2_H    BOOL b;#endif    struct linger linger;    struct sockaddr addr;    int len;    int client;    dbg_printf("beasy_accept\n");    len = sizeof(addr);    client = baccept(bfd, &addr, &len);    if (client == BFD_INVALID_SOCKET)    {	return BFD_INVALID_SOCKET;    }    linger.l_onoff = 1;    linger.l_linger = 60;    bsetsockopt(client, SOL_SOCKET, SO_LINGER, (char*)&linger, sizeof(linger));#ifdef HAVE_WINSOCK2_H    b = TRUE;    bsetsockopt(client, IPPROTO_TCP, TCP_NODELAY, (char*)&b, sizeof(BOOL));#endif    return client;}/*@   beasy_closesocket - closesocket   Parameters:+  int bfd - bsocket   Notes:@*/int beasy_closesocket(int bfd){#ifdef HAVE_WINSOCK2_H    WSAEVENT hEvent = WSACreateEvent();    if (hEvent != WSA_INVALID_EVENT)    {	if (WSAEventSelect(bget_fd(bfd), hEvent, FD_CLOSE) == 0)	{	    shutdown(bget_fd(bfd), SD_BOTH);	    WaitForSingleObject(hEvent, 200);	    /*	    if (WaitForSingleObject(hEvent, 100) == WAIT_TIMEOUT)	    {		BPRINTF("wait for close timed out\n");fflush(stdout);	    }	    else	    {		BPRINTF("wait for close succeeded\n");fflush(stdout);	    }	    */	    WSACloseEvent(hEvent);	}	else	    shutdown(bget_fd(bfd), SD_BOTH);    }    else	shutdown(bget_fd(bfd), SD_BOTH);#endif    dbg_printf("beasy_closesocket\n");    bclose(bfd);    return 0;}/*@   beasy_get_sock_info - get bsocket information   Parameters:+  int bfd - bsocket.  char *name - hostname-  int *port - port   Notes:@*/int beasy_get_sock_info(int bfd, char *name, int *port){    struct sockaddr_in addr;    int name_len = sizeof(addr);    dbg_printf("beasy_get_sock_info: ");    getsockname(bget_fd(bfd), (struct sockaddr*)&addr, &name_len);    *port = ntohs(addr.sin_port);    gethostname(name, 100);    dbg_printf("%s:%d\n", name, *port);    return 0;}/*@   beasy_get_ip_string - get ip string a.b.c.d   Parameters:.  char *ipstring - string   Notes:@*/int beasy_get_ip_string(char *ipstring){    char hostname[100];    unsigned int a, b, c, d;    struct hostent *pH;    dbg_printf("beasy_get_ip_string: ");    gethostname(hostname, 100);    pH = gethostbyname(hostname);    if (pH == NULL)	return SOCKET_ERROR;    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]);    snprintf(ipstring, 100, "%u.%u.%u.%u", a, b, c, d);    dbg_printf("%s\n", ipstring);    return 0;}/*@   beasy_get_ip - get ip address   Parameters:.  long *ip - ip address   Notes:@*/int beasy_get_ip(unsigned long *ip){    char hostname[100];    struct hostent *pH;    dbg_printf("beasy_get_ip\n");    gethostname(hostname, 100);    pH = gethostbyname(hostname);    *ip = *((unsigned long *)(pH->h_addr_list));    return 0;}/*@   beasy_receive - receive   Parameters:+  int bfd - bsocket.  char *buffer - buffer-  int len - length   Notes:@*/int beasy_receive(int bfd, char *buffer, int len){    int ret_val;    int num_received;    bfd_set readfds;    int total = len;    /*dbg_printf("beasy_receive\n");*/        num_received = bread(bfd, buffer, len);    if (num_received == SOCKET_ERROR)    {	return SOCKET_ERROR;    }    else    {	len -= num_received;	buffer += num_received;    }        while (len)    {	BFD_ZERO(&readfds); 	BFD_SET(bfd, &readfds);		ret_val = bselect(bfd+1, &readfds, NULL, NULL, NULL);	if (ret_val == 1)	{	    num_received = bread(bfd, buffer, len);	    if (num_received == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	    else	    {		if (num_received == 0)		{		    /*BPRINTF("beasy_receive: socket closed\n");*/		    /*bmake_blocking(bfd);*/		    return 0;		}		len -= num_received;		buffer += num_received;	    }	}	else	{	    if (ret_val == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	}    }    /*bmake_blocking(bfd);*/    return total;}/*@   beasy_receive_some - receive   Parameters:+  int bfd - bsocket.  char *buffer - buffer-  int len - length   Notes:@*/int beasy_receive_some(int bfd, char *buffer, int len){    int ret_val;    int num_received;    bfd_set readfds;    /*dbg_printf("beasy_receive_some\n");*/        num_received = bread(bfd, buffer, len);    if (num_received == SOCKET_ERROR)    {	if ((errno != EINTR) || (errno != EAGAIN))	    return SOCKET_ERROR;    }    else    {	if (num_received > 0)	    return num_received;    }        BFD_ZERO(&readfds);     BFD_SET(bfd, &readfds);        ret_val = bselect(bfd+1, &readfds, NULL, NULL, NULL);    if (ret_val == 1)    {	num_received = bread(bfd, buffer, len);	if (num_received == SOCKET_ERROR)	{	    if ((errno != EINTR) || (errno != EAGAIN))		return SOCKET_ERROR;	}	else	{	    if (num_received == 0)	    {		/*BPRINTF("beasy_receive_some: socket closed\n");*/		/*bmake_blocking(bfd);*/	    }	    return num_received;	}    }    return SOCKET_ERROR;}/*@   beasy_receive_timeout - receive   Parameters:+  int bfd - bsocket.  char *buffer - buffer.  int len - length-  int timeout - timeout   Notes:@*/int beasy_receive_timeout(int bfd, char *buffer, int len, int timeout){    int ret_val;    int num_received;    bfd_set readfds;    struct timeval tv;    int total = len;    /*dbg_printf("beasy_receive_timeout\n");*/        /*    num_received = bread(bfd, buffer, len);    if (num_received == SOCKET_ERROR)    {	return SOCKET_ERROR;    }    else    {	len -= num_received;	buffer += num_received;    }    */        while (len)    {	BFD_ZERO(&readfds); 	BFD_SET(bfd, &readfds);	tv.tv_sec = timeout;	tv.tv_usec = 0;		ret_val = bselect(bfd+1, &readfds, NULL, NULL, &tv);	if (ret_val == 1)	{	    num_received = bread(bfd, buffer, len);	    if (num_received == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	    else	    {		if (num_received == 0)		{		    /*BPRINTF("beasy_receive_timeout: socket closed\n");*/		    /*bmake_blocking(bfd);*/		    return total - len;		}		len -= num_received;		buffer += num_received;	    }	}	else	{	    if (ret_val == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	    else	    {		/*bmake_blocking(bfd);*/		return total - len;	    }	}    }    /*bmake_blocking(bfd);*/    return total;}/*@   beasy_send - send   Parameters:+  int bfd - bsocket.  char *buffer - buffer-  int length - length   Notes:@*/int beasy_send(int bfd, char *buffer, int length){#ifdef HAVE_WINSOCK2_H    int error;    int num_sent;    while ((num_sent = bwrite(bfd, buffer, length)) == SOCKET_ERROR)    {	error = WSAGetLastError();	if (error == WSAEWOULDBLOCK)	{            /*Sleep(0);*/	    continue;	}	if (error == WSAENOBUFS)	{	    /* If there is no buffer space available then split the buffer in half and send each piece separately.*/	    if (beasy_send(bfd, buffer, length/2) == SOCKET_ERROR)		return SOCKET_ERROR;	    if (beasy_send(bfd, buffer+(length/2), length - (length/2)) == SOCKET_ERROR)		return SOCKET_ERROR;	    return length;	}	WSASetLastError(error);	return SOCKET_ERROR;    }        return length;#else    int ret_val;    int num_written;    bfd_set writefds;    int total = length;    /*dbg_printf("beasy_send\n");*/        num_written = bwrite(bfd, buffer, length);    if (num_written == SOCKET_ERROR)    {	if ((errno != EINTR) || (errno != EAGAIN))	    return SOCKET_ERROR;    }    else    {	length -= num_written;	buffer += num_written;    }        while (length)    {	BFD_ZERO(&writefds); 	BFD_SET(bfd, &writefds);		ret_val = bselect(1, NULL, &writefds, NULL, NULL);	if (ret_val == 1)	{	    num_written = bwrite(bfd, buffer, length);	    if (num_written == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	    else	    {		if (num_written == 0)		{		    /*BPRINTF("beasy_send: socket closed\n");*/		    return total - length;		}		length -= num_written;		buffer += num_written;	    }	}	else	{	    if (ret_val == SOCKET_ERROR)	    {		if ((errno != EINTR) || (errno != EAGAIN))		    return SOCKET_ERROR;	    }	}    }    return total;#endif}int beasy_getlasterror(){    /*dbg_printf("beasy_getlasterror\n");*/#ifdef HAVE_WINSOCK2_H    return WSAGetLastError();#else    return errno;#endif}int beasy_error_to_string(int error, char *str, int length){#ifdef HAVE_WINSOCK2_H    HLOCAL str_local;    int num_bytes;    num_bytes = FormatMessage(	FORMAT_MESSAGE_FROM_SYSTEM |	FORMAT_MESSAGE_ALLOCATE_BUFFER,	0,	error,	MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),	(LPTSTR) &str_local,	0,0);    if (num_bytes < length)	memcpy(str, str_local, num_bytes+1);    else    {	LocalFree(str);	return num_bytes+1;    }    LocalFree(str);    strtok(str, "\r\n"); /* remove any CR/LF characters from the output */#else    /*dbg_printf("beasy_error_to_string\n");*/    strncpy(str, strerror(error), length);#endif    return 0;}

⌨️ 快捷键说明

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