int JackNetUnixSocket::Send ( const void* buffer, size_t nbytes, int flags ) { #if defined(__sun__) || defined(sun) if (WaitWrite() < 0) return -1; #endif return send ( fSockfd, buffer, nbytes, flags ); }
//network operations************************************************************************************************** int JackNetUnixSocket::SendTo ( const void* buffer, size_t nbytes, int flags ) { #if defined(__sun__) || defined(sun) if (WaitWrite() < 0) return -1; #endif return sendto ( fSockfd, buffer, nbytes, flags, reinterpret_cast<socket_address_t*> ( &fSendAddr ), sizeof ( socket_address_t ) ); }
/* *功能: 发数据(一直发完nBytes字节为止,或者出错为止,或者超时为止) *输入参数: const void *pBuffer:待发送的缓冲区 unsigned int &nBytes:缓冲区的长度 int timeout: 超时的毫秒数(1秒=1000毫秒) -1表阻塞式接收 0:不可发时立即返回,不等待 >0:不可发时等待至超时 int flags:标志 *输出参数: unsigned int &nBytes:返回已发送的字节数 *返回值: -2:timeout -1:失败,具体错误可以通过GetLastError()获取 0:对方已关闭 >0:收到的数据长度 */ int CBaseSocket::SendN(unsigned int &nwrite, const void *pBuffer, unsigned int nBytes,int timeout /*= -1*/, int flags /*= 0*/) { if(m_iSocket < 0) { return -1; } nwrite = 0; if(timeout < 0) { return WriteN(nwrite, pBuffer, nBytes); } struct timeval start; struct timezone tz; gettimeofday(&start, &tz); unsigned int left = nBytes; int n = 0; char *ptr = (char *)pBuffer; while(1) { n = WaitWrite(timeout); if(n < 0) //error { return n; } n = send(m_iSocket, ptr, left, flags); if( n < 0) { if(errno == EINTR) { continue; } return n; } if(n == 0) { return 0; } left -= n; ptr += n; nwrite += n; if(left <= 0) { break; } timeout -= DiffMillSec(start); if(timeout <= 0) //timeout { return -2; } } return nwrite; }
int JackNetUnixSocket::SendTo ( const void* buffer, size_t nbytes, int flags, const char* ip ) { int addr_conv = inet_aton ( ip, &fSendAddr.sin_addr ); if ( addr_conv < 1 ) return addr_conv; #if defined(__sun__) || defined(sun) if (WaitWrite() < 0) return -1; #endif return SendTo ( buffer, nbytes, flags ); }
/* *功能: 发数据 *输入参数: const void *chBuff:待发送的数据 unsigned int nSize:缓冲区的长度 int timeout: 超时的毫秒数(1秒=1000毫秒) -1表阻塞式接收 0:不可发时立即返回,不等待 >0:不可发时等待至超时 int flag:发送标志 *输出参数: 无 *返回值: -1:失败,具体错误可以通过GetLastError()获取 >=0:已发送的数据长度 */ int CBaseSocket::Send(const void* chBuff, unsigned int nSize, int timeout /*= -1*/, int flags /*= 0*/) { if(timeout < 0) { return send(m_iSocket, chBuff, nSize, flags); } int n = WaitWrite( timeout ); if(n != 0) { return n; } return send(m_iSocket, chBuff, nSize, flags); }
size_t TTYPort::Write(const void *data, size_t length) { assert(fd >= 0); if (!valid.Get()) return 0; ssize_t nbytes = write(fd, data, length); if (nbytes < 0 && errno == EAGAIN) { /* the output fifo is full; wait until we can write (or until the timeout expires) */ if (WaitWrite(5000) != Port::WaitResult::READY) return 0; nbytes = write(fd, data, length); } return nbytes < 0 ? 0 : nbytes; }
size_t TTYPort::Write(const void *data, size_t length) { assert(tty.IsDefined()); if (!valid.load(std::memory_order_relaxed)) return 0; ssize_t nbytes = tty.Write(data, length); if (nbytes < 0 && errno == EAGAIN) { /* the output fifo is full; wait until we can write (or until the timeout expires) */ if (WaitWrite(5000) != Port::WaitResult::READY) return 0; nbytes = tty.Write(data, length); } return nbytes < 0 ? 0 : nbytes; }