📄 bsockets.c
字号:
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 + -