RNS2SendResult RNS2_Windows_Linux_360::Send_Windows_Linux_360NoVDP( RNS2Socket rns2Socket, RNS2_SendParameters *sendParameters, const char *file, unsigned int line ) { int len=0; do { (void) file; (void) line; int oldTTL=-1; if (sendParameters->ttl>0) { socklen_t opLen=sizeof(oldTTL); // Get the current TTL if (getsockopt__(rns2Socket, sendParameters->systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & oldTTL, &opLen ) != -1) { int newTTL=sendParameters->ttl; setsockopt__(rns2Socket, sendParameters->systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & newTTL, sizeof ( newTTL ) ); } } if (sendParameters->systemAddress.address.addr4.sin_family==AF_INET) { len = sendto__( rns2Socket, sendParameters->data, sendParameters->length, 0, ( const sockaddr* ) & sendParameters->systemAddress.address.addr4, sizeof( sockaddr_in ) ); } else { #if RAKNET_SUPPORT_IPV6==1 len = sendto__( rns2Socket, sendParameters->data, sendParameters->length, 0, ( const sockaddr* ) & sendParameters->systemAddress.address.addr6, sizeof( sockaddr_in6 ) ); #endif } if (len<0) { RAKNET_DEBUG_PRINTF("sendto failed with code %i for char %i and length %i.\n", len, sendParameters->data[0], sendParameters->length); } if (oldTTL!=-1) { setsockopt__(rns2Socket, sendParameters->systemAddress.GetIPPROTO(), IP_TTL, ( char * ) & oldTTL, sizeof ( oldTTL ) ); } } while ( len == 0 ); return len; }
void RNS2_Berkley::SetDoNotFragment( int opt ) { #if defined( IP_DONTFRAGMENT ) #if defined(_WIN32) && !defined(_DEBUG) // If this assert hit you improperly linked against WSock32.h RakAssert(IP_DONTFRAGMENT==14); #endif setsockopt__( rns2Socket, boundAddress.GetIPPROTO(), IP_DONTFRAGMENT, ( char * ) & opt, sizeof ( opt ) ); #endif }
void RNS2_Berkley::SetSocketOptions(void) { int r; // This doubles the max throughput rate int sock_opt=1024*256; r = setsockopt__( rns2Socket, SOL_SOCKET, SO_RCVBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); RakAssert(r==0); // Immediate hard close. Don't linger the socket, or recreating the socket quickly on Vista fails. // Fail with voice and xbox sock_opt=0; r = setsockopt__( rns2Socket, SOL_SOCKET, SO_LINGER, ( char * ) & sock_opt, sizeof ( sock_opt ) ); // Do not assert, ignore failure // This doesn't make much difference: 10% maybe // Not supported on console 2 sock_opt=1024*16; r = setsockopt__( rns2Socket, SOL_SOCKET, SO_SNDBUF, ( char * ) & sock_opt, sizeof ( sock_opt ) ); RakAssert(r==0); }
void RNS2_Berkley::SetBroadcastSocket(int broadcast) { setsockopt__( rns2Socket, SOL_SOCKET, SO_BROADCAST, ( char * ) & broadcast, sizeof( broadcast ) ); }
void RNS2_Berkley::SetIPHdrIncl(int ipHdrIncl) { setsockopt__( rns2Socket, IPPROTO_IP, IP_HDRINCL, ( char * ) & ipHdrIncl, sizeof( ipHdrIncl ) ); }
RNS2BindResult RNS2_Berkley::BindSharedIPV4( RNS2_BerkleyBindParameters *bindParameters, const char *file, unsigned int line ) { (void) file; (void) line; int ret; memset(&boundAddress.address.addr4,0,sizeof(sockaddr_in)); boundAddress.address.addr4.sin_port = htons( bindParameters->port ); rns2Socket = (int) socket__( bindParameters->addressFamily, bindParameters->type, bindParameters->protocol ); if (rns2Socket == -1) return BR_FAILED_TO_BIND_SOCKET; SetSocketOptions(); SetNonBlockingSocket(bindParameters->nonBlockingSocket); SetBroadcastSocket(bindParameters->setBroadcast); SetIPHdrIncl(bindParameters->setIPHdrIncl); // Fill in the rest of the address structure boundAddress.address.addr4.sin_family = AF_INET; if (bindParameters->hostAddress && bindParameters->hostAddress[0]) { boundAddress.address.addr4.sin_addr.s_addr = inet_addr__( bindParameters->hostAddress ); } else { // RAKNET_DEBUG_PRINTF("Binding any on port %i\n", port); boundAddress.address.addr4.sin_addr.s_addr = INADDR_ANY; } //LHQ: enable socket port reuse #if RAKNET_ENABLE_SOCKET_ADDR_PORT_REUSE int _sock_reuse_opt = 1; setsockopt__(rns2Socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&_sock_reuse_opt, sizeof _sock_reuse_opt); #ifdef SO_REUSEPORT setsockopt__(rns2Socket, SOL_SOCKET, SO_REUSEPORT, (const char*)&_sock_reuse_opt, sizeof _sock_reuse_opt); #endif #endif//RAKNET_ENABLE_SOCKET_ADDR_PORT_REUSE // bind our name to the socket ret = bind__( rns2Socket, ( struct sockaddr * ) &boundAddress.address.addr4, sizeof( boundAddress.address.addr4 ) ); if ( ret <= -1 ) { #if defined(_WIN32) closesocket__(rns2Socket); return BR_FAILED_TO_BIND_SOCKET; #elif (defined(__GNUC__) || defined(__GCCXML__) ) && !defined(_WIN32) closesocket__(rns2Socket); switch (ret) { case EBADF: RAKNET_DEBUG_PRINTF("bind__(): sockfd is not a valid descriptor.\n"); break; case ENOTSOCK: RAKNET_DEBUG_PRINTF("bind__(): Argument is a descriptor for a file, not a socket.\n"); break; case EINVAL: RAKNET_DEBUG_PRINTF("bind__(): The addrlen is wrong, or the socket was not in the AF_UNIX family.\n"); break; case EROFS: RAKNET_DEBUG_PRINTF("bind__(): The socket inode would reside on a read-only file system.\n"); break; case EFAULT: RAKNET_DEBUG_PRINTF("bind__(): my_addr points outside the user's accessible address space.\n"); break; case ENAMETOOLONG: RAKNET_DEBUG_PRINTF("bind__(): my_addr is too long.\n"); break; case ENOENT: RAKNET_DEBUG_PRINTF("bind__(): The file does not exist.\n"); break; case ENOMEM: RAKNET_DEBUG_PRINTF("bind__(): Insufficient kernel memory was available.\n"); break; case ENOTDIR: RAKNET_DEBUG_PRINTF("bind__(): A component of the path prefix is not a directory.\n"); break; case EACCES: // Port reserved on PS4 RAKNET_DEBUG_PRINTF("bind__(): Search permission is denied on a component of the path prefix.\n"); break; case ELOOP: RAKNET_DEBUG_PRINTF("bind__(): Too many symbolic links were encountered in resolving my_addr.\n"); break; default: RAKNET_DEBUG_PRINTF("Unknown bind__() error %i.\n", ret); break; } #endif return BR_FAILED_TO_BIND_SOCKET; } GetSystemAddressIPV4(rns2Socket, &boundAddress ); return BR_SUCCESS; }