Beispiel #1
0
 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 );
 }
Beispiel #2
0
 //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 ) );
 }
Beispiel #3
0
/*
*功能:
		发数据(一直发完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;
}
Beispiel #4
0
 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 );
 }
Beispiel #5
0
/*
*功能:
		发数据
*输入参数:
		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);
}
Beispiel #6
0
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;
}
Beispiel #7
0
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;
}