Ejemplo n.º 1
0
void CPipeState_Listening::ProcessEvent(bool bRead,bool /*bWrite*/,bool /*bError*/)
{
	if( !bRead )
		return;

	for(;;)
	{
		SOCKET Socket = accept( m_Socket , NULL , NULL );

		if( INVALID_SOCKET == Socket )
		{
			int nErrorCode=SocketGetLastError();
			switch(nErrorCode)
			{
#ifndef _WIN32
			case ECONNABORTED:
			case EMFILE:
#endif
			case EWOULDBLOCK:
				return;
			}
			ostringstream strm;
			strm<<"accept failed with error code:"<<nErrorCode<<".";
			GenErr(strm.str());
		}

		u_long uParam=1;
		if( SOCKET_ERROR == ioctlsocket( Socket , FIONBIO , &uParam ) )
		{
			closesocket( Socket );
			ostringstream strm;
			strm<<"ioctlsocket failed with error code "<< SocketGetLastError() <<".";
			GenErr(strm.str());
		}

		bool bDisconnected;
		CSyncPipe* pNewPipe = new CSyncPipe( NULL ,	GetPipe()->m_OutBuffer.OutBufferGetSize() ,
			GetPipe()->m_InBuffer.InBufferGetSize(),Socket , GetPipe()->m_uCreationFlag,bDisconnected );
		
		if( bDisconnected )
		{
			delete pNewPipe;
		}
		else
		{
			GetPipe()->AddEventAccepted( pNewPipe );
		}
	}
}
Ejemplo n.º 2
0
gboolean
Socket_Send(SOCKET fd,      // IN
            char *buf,      // IN
            int len)        // IN
{
   int left = len;
   int sent = 0;
   int rv;
   int sysErr;

   while (left > 0) {
      rv = send(fd, buf + sent, left, 0);
      if (rv == SOCKET_ERROR) {
         sysErr = SocketGetLastError();
         if (sysErr == SYSERR_EINTR) {
            continue;
         }
         Warning(LGPFX "Send error for socket %d: %d[%s]", fd, sysErr,
                 Err_Errno2String(sysErr));
         return FALSE;
      }
      left -= rv;
      sent += rv;
   }

   Debug(LGPFX "Sent %d bytes from socket %d\n", len, fd);
   return TRUE;
}
Ejemplo n.º 3
0
CPipeState_Listening::CPipeState_Listening(CSyncPipe* pPipe,SOCKET Socket)
:CPipeState_Busy(pPipe,Socket)
{
	CPipeState* pState=GetPipe()->m_pState;
	GetPipe()->m_pState=NULL;
	delete pState;
	GetPipe()->m_pState=this;

#ifdef _WIN32
	SQR_TRY
	{
		m_Event.Create(m_Socket);
	}
	SQR_CATCH(exp)
	{
		LogExp(exp);
		closesocket(m_Socket);
		throw;
	}
	SQR_TRY_END;
#endif

	Register();

	if( listen(m_Socket,SOMAXCONN) )
	{
		ostringstream strm;
		strm<<"listen failed with error code:"<<SocketGetLastError()<<".";
		GenErr(strm.str());
	}
}
Ejemplo n.º 4
0
gboolean
Socket_Recv(SOCKET fd,      // IN
            char *buf,      // OUT
            int len)        // IN
{
   int remaining = len;
   int rv;
   int sysErr;

   while (remaining > 0) {
      rv = recv(fd, buf , remaining, 0);
      if (rv == 0) {
         Warning(LGPFX "Socket %d closed by peer.", fd);
         return FALSE;
      }
      if (rv == SOCKET_ERROR) {
         sysErr = SocketGetLastError();
         if (sysErr == SYSERR_EINTR) {
            continue;
         }
         Warning(LGPFX "Recv error for socket %d: %d[%s]", fd, sysErr,
                 Err_Errno2String(sysErr));
         return FALSE;
      }
      remaining -= rv;
      buf += rv;
   }

   Debug(LGPFX "Recved %d bytes from socket %d\n", len, fd);
   return TRUE;
}
Ejemplo n.º 5
0
gboolean
Socket_RecvPacket(SOCKET sock,               // IN
                  char **payload,            // OUT
                  int *payloadLen)           // OUT
{
   gboolean ok;
   int32 packetLen;
   int packetLenSize = sizeof packetLen;
   int fullPktLen;
   char *recvBuf;
   int recvBufLen;

   ok = Socket_Recv(sock, (char *)&packetLen, packetLenSize);
   if (!ok) {
      Debug(LGPFX "error in recving packet header, err=%d\n",
            SocketGetLastError());
      return FALSE;
   }

   fullPktLen = ntohl(packetLen) + packetLenSize;
   recvBufLen = fullPktLen;
   recvBuf = malloc(recvBufLen);
   if (recvBuf == NULL) {
      Debug(LGPFX "Could not allocate recv buffer.\n");
      return FALSE;
   }

   memcpy(recvBuf, &packetLen, packetLenSize);
   ok = Socket_Recv(sock, recvBuf + packetLenSize,
                     fullPktLen - packetLenSize);
   if (!ok) {
      Debug(LGPFX "error in recving packet, err=%d\n",
            SocketGetLastError());
      free(recvBuf);
      return FALSE;
   }

   ok = Socket_DecodePacket(recvBuf, fullPktLen, payload, payloadLen);
   free(recvBuf);
   return ok;
}
int API_recv(SOCKETDESC *desc, void *data, size_t cbMaxData)
{
    PyClient *client = (PyClient *) desc->prv;

    if (client == NULL)
    {
        PyErr_Format(PyExc_IOError, "No client object");

        PRINTMARK();
        return -1;
    }

    int result;

    while (true)
    {
        result = recv ( client->sockfd, (char *) data, cbMaxData, MSG_NOSIGNAL);

        if (result == 0)
        {
            PRINTMARK();
            PyErr_Format(PyExc_IOError, "Connection reset by peer while reading on socket");
            return -1;
        }

        if (result > 0)
        {
            PRINTMARK();
            break;
        }

        PRINTMARK();
        if (!SocketWouldBlock(client->sockfd))
        {
            PyErr_Format(PyExc_IOError, "Socket error %d when reading", SocketGetLastError());
            return -1;
        }

        PRINTMARK();
        if (API_wouldBlock_gevent(client->sock, client->sockfd, 1, 10) == 0)
        {
            PRINTMARK();
            return -1;
        }
        PRINTMARK();

    }

    return result;
}
Ejemplo n.º 7
0
void
Socket_Close(SOCKET sock)
{
   int res;

#if defined(_WIN32)
   res = closesocket(sock);
#else
   res = close(sock);
#endif

   if (res == SOCKET_ERROR) {
      int err = SocketGetLastError();
      Warning(LGPFX "Error in closing socket %d: %d[%s]\n",
              sock, err, Err_Errno2String(err));
   }

   SocketCleanup();
}
Ejemplo n.º 8
0
int CPipeState_Listening::CreateBindedSocket(SOCKET& SocketOut,const CAddress& Address)
{
	SOCKET Socket=CreateSocket();

	sockaddr_in saiAddress;
	memset(&saiAddress,0,sizeof(saiAddress));

	saiAddress.sin_addr.s_addr = inet_addr( Address.GetAddress() );
	saiAddress.sin_port = htons( static_cast<u_short>( Address.GetPort() ) );
	saiAddress.sin_family = AF_INET;

	//bind
	if( bind( Socket,reinterpret_cast<sockaddr*>( &saiAddress) , sizeof(sockaddr) ) )
	{
		closesocket(Socket);
		return SocketGetLastError();
	}

	SocketOut=Socket;
	return 0;
}
Ejemplo n.º 9
0
SOCKET
Socket_ConnectVMCI(unsigned int cid,                  // IN
                   unsigned int port,                 // IN
                   gboolean isPriv,                   // IN
                   SockConnError *outError)           // OUT
{
   struct sockaddr_vm addr;
   SOCKET fd;
   SockConnError error = SOCKERR_GENERIC;
   int sysErr;
   socklen_t addrLen = sizeof addr;
   int vsockDev = -1;
   int family = VMCISock_GetAFValueFd(&vsockDev);

   if (outError) {
      *outError = SOCKERR_SUCCESS;
   }

   if (!SocketStartup()) {
      goto error;
   }

   if (family == -1) {
      Warning(LGPFX "Couldn't get VMCI socket family info.");
      goto error;
   }

   memset((char *)&addr, 0, sizeof addr);
   addr.svm_family = family;
   addr.svm_cid = cid;
   addr.svm_port = port;

   Debug(LGPFX "creating new socket, connecting to %u:%u\n", cid, port);

   fd = socket(addr.svm_family, SOCK_STREAM, 0);
   if (fd == INVALID_SOCKET) {
      sysErr = SocketGetLastError();
      Warning(LGPFX "failed to create socket, error %d: %s\n",
              sysErr, Err_Errno2String(sysErr));
      goto error;
   }

   if (isPriv) {
      struct sockaddr_vm localAddr;
      gboolean bindOk = FALSE;
      int localPort;

      memset(&localAddr, 0, sizeof localAddr);
      localAddr.svm_family = addr.svm_family;
      localAddr.svm_cid = VMCISock_GetLocalCID();

      /* Try to bind to port 1~1023 for a privileged user. */
      for (localPort = PRIVILEGED_PORT_MAX;
           localPort >= PRIVILEGED_PORT_MIN; localPort--) {

         localAddr.svm_port = localPort;

         if (bind(fd, (struct sockaddr *)&localAddr, sizeof localAddr) != 0) {
            sysErr = SocketGetLastError();
            if (sysErr == SYSERR_EACCESS) {
               Warning(LGPFX "Couldn't bind to privileged port for "
                       "socket %d\n", fd);
               error = SOCKERR_EACCESS;
               Socket_Close(fd);
               goto error;
            }
            if (sysErr == SYSERR_EADDRINUSE) {
               continue;
            }
            Warning(LGPFX "could not bind socket, error %d: %s\n", sysErr,
                    Err_Errno2String(sysErr));
            Socket_Close(fd);
            error = SOCKERR_BIND;
            goto error;
         } else {
            bindOk = TRUE;
            break;
         }
      }

      if (!bindOk) {
         Warning(LGPFX "Failed to bind to privileged port for socket %d, "
                 "no port available\n", fd);
         error = SOCKERR_BIND;
         Socket_Close(fd);
         goto error;
      } else {
         Debug(LGPFX "Successfully bound to port %d for socket %d\n",
               localAddr.svm_port, fd);
      }
   }

   if (connect(fd, (struct sockaddr *)&addr, addrLen) != 0) {
      sysErr = SocketGetLastError();
      Warning(LGPFX "socket connect failed, error %d: %s\n",
              sysErr, Err_Errno2String(sysErr));
      Socket_Close(fd);
      error = SOCKERR_CONNECT;
      goto error;
   }

   VMCISock_ReleaseAFValueFd(vsockDev);
   Debug(LGPFX "socket %d connected\n", fd);
   return fd;

error:
   if (outError) {
      *outError = error;
   }
   VMCISock_ReleaseAFValueFd(vsockDev);

   return INVALID_SOCKET;
}
Ejemplo n.º 10
0
CPipeState_Connecting::CPipeState_Connecting(CSyncPipe* pPipe,const CAddress& Address,uint32& uResult)
    :CPipeState_Busy(pPipe)
{
    pPipe->m_OutBuffer.OutBufferClear();
    pPipe->m_InBuffer.InBufferClear();

    CPipeState* pState=GetPipe()->m_pState;
    GetPipe()->m_pState=NULL;
    delete pState;
    GetPipe()->m_pState=this;

    const SOCKET& Socket=m_Socket;

#ifdef _WIN32
    SQR_TRY
    {
        m_Event.Create(Socket);
    }
    SQR_CATCH (exp)
    {
        LogExp(exp);
        closesocket(m_Socket);
        throw;
    }
    SQR_TRY_END;
#endif

    Register();

    sockaddr_in saiAddress;
    ::memset(&saiAddress,0,sizeof(saiAddress));

    saiAddress.sin_addr.s_addr = inet_addr(Address.GetAddress());
    saiAddress.sin_port = htons(static_cast<u_short>(Address.GetPort()));
    saiAddress.sin_family = AF_INET;


    //连接
    int nResult;

    nResult=connect(Socket,reinterpret_cast<sockaddr*>(&saiAddress),sizeof(sockaddr));

    if(SOCKET_ERROR!=nResult)
    {
        uResult=0;
    }
    else
    {
        int nError=SocketGetLastError();
        switch(nError)
        {
#if defined(__linux__)
        case EINPROGRESS:
#elif defined(_WIN32)
        case EWOULDBLOCK:
#endif
            uResult=1;
            break;
#ifdef _WIN32
        case ECONNABORTED://Windows下还真会出现这种情况
        case ENOBUFS:
            uResult=2;
            GetPipe()->AddEventConnectFailed(ePCFR_OSERROR);
            return;
#endif
        case ECONNRESET:
        case ECONNREFUSED:
            uResult=2;
            GetPipe()->AddEventConnectFailed(ePCFR_REFUSED);
            return;
        case ETIMEDOUT:
        case ENETRESET:
        case EHOSTUNREACH:
        case ENETUNREACH:
            uResult=2;
            GetPipe()->AddEventConnectFailed(ePCFR_UNREACHABLE);
            return;
        default:
            closesocket(m_Socket);
            stringstream strm;
            strm<<"connect failed with error code "<<nError<<".";
            GenErr(strm.str());
        }
    }

    m_RemoteAddress=Address;
}