Changeset 15 in flair-src for trunk/lib/FlairCore/src/UdtSocket.cpp
- Timestamp:
- 04/08/16 15:40:57 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/FlairCore/src/UdtSocket.cpp
r2 r15 24 24 using std::string; 25 25 26 namespace flair 27 { 28 namespace core 29 { 26 namespace flair { 27 namespace core { 30 28 31 UdtSocket::UdtSocket(const Object* parent,const std::string name,bool _blockOnSend,bool _blockOnReceive):ConnectedSocket(parent,name) { 32 UDT::startup(); 33 blockOnSend=_blockOnSend; 34 blockOnReceive=_blockOnReceive; 29 UdtSocket::UdtSocket(const Object *parent, const std::string name, 30 bool _blockOnSend, bool _blockOnReceive) 31 : ConnectedSocket(parent, name) { 32 UDT::startup(); 33 blockOnSend = _blockOnSend; 34 blockOnReceive = _blockOnReceive; 35 35 } 36 36 37 UdtSocket::~UdtSocket(){ 38 } 37 UdtSocket::~UdtSocket() {} 39 38 40 void UdtSocket::Listen(const unsigned int port,const std::string localAddress) { 41 socket = UDT::socket(AF_INET, SOCK_DGRAM, 0); 39 void UdtSocket::Listen(const unsigned int port, 40 const std::string localAddress) { 41 socket = UDT::socket(AF_INET, SOCK_DGRAM, 0); 42 42 43 44 45 46 43 UDT::setsockopt(socket, 0, UDT_SNDSYN, &blockOnSend, sizeof(bool)); 44 UDT::setsockopt(socket, 0, UDT_RCVSYN, &blockOnReceive, sizeof(bool)); 45 bool reuse = true; 46 UDT::setsockopt(socket, 0, UDT_REUSEADDR, &reuse, sizeof(bool)); 47 47 48 49 50 51 if (localAddress=="ANY") {52 my_addr.sin_addr.s_addr=INADDR_ANY;53 54 inet_aton(localAddress.c_str(),&(my_addr.sin_addr));55 56 48 sockaddr_in my_addr; 49 my_addr.sin_family = AF_INET; 50 my_addr.sin_port = htons(port); 51 if (localAddress == "ANY") { 52 my_addr.sin_addr.s_addr = INADDR_ANY; 53 } else { 54 inet_aton(localAddress.c_str(), &(my_addr.sin_addr)); 55 } 56 memset(&(my_addr.sin_zero), '\0', 8); 57 57 58 if (UDT::ERROR == UDT::bind(socket, (sockaddr*)&my_addr, sizeof(my_addr))) {59 Err("bind, %s\n",UDT::getlasterror().getErrorMessage());60 58 if (UDT::ERROR == UDT::bind(socket, (sockaddr *)&my_addr, sizeof(my_addr))) { 59 Err("bind, %s\n", UDT::getlasterror().getErrorMessage()); 60 } 61 61 62 62 UDT::listen(socket, 1); 63 63 } 64 64 65 65 UdtSocket *UdtSocket::Accept(Time timeout) { 66 67 UdtSocket *acceptedSocket=new UdtSocket(this->Parent(),this->ObjectName());68 acceptedSocket->blockOnSend=this->blockOnSend;69 acceptedSocket->blockOnReceive=this->blockOnReceive;66 // TIMEOUT UNSUPPORTED!! 67 UdtSocket *acceptedSocket = new UdtSocket(this->Parent(), this->ObjectName()); 68 acceptedSocket->blockOnSend = this->blockOnSend; 69 acceptedSocket->blockOnReceive = this->blockOnReceive; 70 70 71 72 71 sockaddr_in their_addr; 72 int namelen = sizeof(their_addr); 73 73 74 if ((acceptedSocket->socket = UDT::accept(socket, (sockaddr*)&their_addr, &namelen))==UDT::INVALID_SOCK) { 75 Err("accept: %s, code %i\n",UDT::getlasterror().getErrorMessage(),UDT::getlasterror().getErrorCode()); 76 } 74 if ((acceptedSocket->socket = UDT::accept(socket, (sockaddr *)&their_addr, 75 &namelen)) == UDT::INVALID_SOCK) { 76 Err("accept: %s, code %i\n", UDT::getlasterror().getErrorMessage(), 77 UDT::getlasterror().getErrorCode()); 78 } 77 79 78 80 return acceptedSocket; 79 81 } 80 82 81 bool UdtSocket::Connect(const unsigned int port,const std::string distantAddress,Time timeout) { 82 bool success=true; 83 socket=UDT::socket(AF_INET, SOCK_DGRAM, 0); 83 bool UdtSocket::Connect(const unsigned int port, 84 const std::string distantAddress, Time timeout) { 85 bool success = true; 86 socket = UDT::socket(AF_INET, SOCK_DGRAM, 0); 84 87 85 86 87 88 88 UDT::setsockopt(socket, 0, UDT_SNDSYN, &blockOnSend, sizeof(bool)); 89 UDT::setsockopt(socket, 0, UDT_RCVSYN, &blockOnReceive, sizeof(bool)); 90 bool reuse = true; 91 UDT::setsockopt(socket, 0, UDT_REUSEADDR, &reuse, sizeof(bool)); 89 92 90 91 92 93 94 95 success=false;96 97 93 sockaddr_in serv_addr; 94 serv_addr.sin_family = AF_INET; 95 serv_addr.sin_port = htons(short(port)); 96 if (inet_pton(AF_INET, distantAddress.c_str(), &serv_addr.sin_addr) <= 0) { 97 printf("incorrect network address."); 98 success = false; 99 } 100 memset(&(serv_addr.sin_zero), '\0', 8); 98 101 99 if (UDT::ERROR == UDT::connect(socket, (sockaddr*)&serv_addr, sizeof(serv_addr))) { 100 success=false; 101 } 102 if (!success) { 103 UDT::close(socket); 104 return false; 105 } else return true; 102 if (UDT::ERROR == 103 UDT::connect(socket, (sockaddr *)&serv_addr, sizeof(serv_addr))) { 104 success = false; 105 } 106 if (!success) { 107 UDT::close(socket); 108 return false; 109 } else 110 return true; 106 111 } 107 112 108 ssize_t UdtSocket::SendMessage(const char* buffer,size_t bufferSize,Time timeout){ 109 int udtTimeout=timeout; 110 if (blockOnSend) { 111 if(UDT::setsockopt(socket, 0, UDT_SNDTIMEO, &udtTimeout, sizeof(udtTimeout))!=0) Err("error UDT_SNDTIMEO %s\n", UDT::getlasterror().getErrorMessage()); 112 } 113 ssize_t bytesSent=UDT::sendmsg(socket, buffer, bufferSize, -1,true); 113 ssize_t UdtSocket::SendMessage(const char *buffer, size_t bufferSize, 114 Time timeout) { 115 int udtTimeout = timeout; 116 if (blockOnSend) { 117 if (UDT::setsockopt(socket, 0, UDT_SNDTIMEO, &udtTimeout, 118 sizeof(udtTimeout)) != 0) 119 Err("error UDT_SNDTIMEO %s\n", UDT::getlasterror().getErrorMessage()); 120 } 121 ssize_t bytesSent = UDT::sendmsg(socket, buffer, bufferSize, -1, true); 114 122 115 123 return bytesSent; 116 124 } 117 125 118 ssize_t UdtSocket::RecvMessage(char* buffer,size_t bufferSize,Time timeout){ 119 int udtTimeout=timeout; 120 if (blockOnReceive) { 121 if(UDT::setsockopt(socket, 0, UDT_RCVTIMEO, &udtTimeout, sizeof(udtTimeout))!=0) Err("error UDT_RCVTIMEO %s\n", UDT::getlasterror().getErrorMessage()); 122 } 123 ssize_t bytesRead= UDT::recvmsg(socket,buffer,bufferSize); 126 ssize_t UdtSocket::RecvMessage(char *buffer, size_t bufferSize, Time timeout) { 127 int udtTimeout = timeout; 128 if (blockOnReceive) { 129 if (UDT::setsockopt(socket, 0, UDT_RCVTIMEO, &udtTimeout, 130 sizeof(udtTimeout)) != 0) 131 Err("error UDT_RCVTIMEO %s\n", UDT::getlasterror().getErrorMessage()); 132 } 133 ssize_t bytesRead = UDT::recvmsg(socket, buffer, bufferSize); 124 134 125 /*126 if(bytesRead<0) {127 if(UDT::getlasterror().getErrorCode()==CUDTException::ECONNLOST) {128 connection_lost=true;129 }130 }131 */132 135 /* 136 if(bytesRead<0) { 137 if(UDT::getlasterror().getErrorCode()==CUDTException::ECONNLOST) { 138 connection_lost=true; 139 } 140 } 141 */ 142 return bytesRead; 133 143 } 134 144 135 uint16_t UdtSocket::NetworkToHost16(uint16_t data) { 136 return ntohs(data); 137 } 145 uint16_t UdtSocket::NetworkToHost16(uint16_t data) { return ntohs(data); } 138 146 139 uint16_t UdtSocket::HostToNetwork16(uint16_t data) { 140 return htons(data); 141 } 147 uint16_t UdtSocket::HostToNetwork16(uint16_t data) { return htons(data); } 142 148 143 uint32_t UdtSocket::NetworkToHost32(uint32_t data) { 144 return ntohl(data); 145 } 149 uint32_t UdtSocket::NetworkToHost32(uint32_t data) { return ntohl(data); } 146 150 147 uint32_t UdtSocket::HostToNetwork32(uint32_t data) { 148 return htonl(data); 149 } 151 uint32_t UdtSocket::HostToNetwork32(uint32_t data) { return htonl(data); } 150 152 151 153 } // end namespace core
Note:
See TracChangeset
for help on using the changeset viewer.