Esempio n. 1
0
int ServerSocket::startListen()
{
    listenSocket = socket(PF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
    if (listenSocket < 0)
    {
        Log::e("create listen socket error.");
        return -1;
    }

    sockaddr_in srvAddr;
    srvAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    srvAddr.sin_family = PF_INET;
    srvAddr.sin_port = htons(config.listenPort);

    int result = bind(listenSocket, (sockaddr*)&srvAddr, sizeof(srvAddr));
    if (result < 0)
    {
        Log::e("bind port %d error. errno=%d", config.listenPort, errno);
        return -1;
    }
    result = listen(listenSocket, 100);
    if (result < 0)
    {
        Log::e("listen port %d error.", config.listenPort);
        return -1;
    }
    Log::i("server is listening port %d, waiting for clients...", config.listenPort);

    epfd = epoll_create(EPOLL_SIZE);
    if (epfd < 0)
    {
        return -1;
    }
    epoll_event ev;
    ev.events = EPOLLIN | EPOLLET;
    ev.data.fd = listenSocket;
    epoll_ctl(epfd, EPOLL_CTL_ADD, listenSocket, &ev);

    // create threads to process epoll events
    std::function<int()> eventProc(std::bind(&ServerSocket::processEventThread, this));
    eventThread = new std::thread(eventProc);
    return 0;
}	//end of startListen
void VstPluginExternalEditor::sendEventToChild (XEvent* event)
{
    if (eventProc)
    {
        // if the plugin publish a event procedure, so it doesn't have
        // a message thread running, pass the event directly
        eventProc (event);
    }
    else
    {
        // if the plugin have a message thread running, then send events to
        // that window: it will be caught by the message thread !
        if (handle)
        {
            XSendEvent (display, handle, False, 0L, event);
            XFlush (display);
        }
    }
}
Esempio n. 3
0
int ServerSocket::startListen()
{
    if (-1 == initWinsock())
    {
        return -1;
    }
    // create an i/o completion port
    completionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
    if (NULL == completionPort)
    {
        Log::e("CreateIoCompletionPort failed. Error: %d", GetLastError());
        return -1;
    }

    // get number of cores of cpu
    SYSTEM_INFO mySysInfo;
    GetSystemInfo(&mySysInfo);

    // create threads to process i/o completion port events
    std::function<int()> eventProc(std::bind(&ServerSocket::processEventThread, this));
    DWORD numThreads = config.numIOCPThreads;
    if (numThreads == 0)
    {
        numThreads = mySysInfo.dwNumberOfProcessors * 2;
    }
    for (DWORD i = 0; i < numThreads; ++i)
    {
        std::thread* th = new std::thread(eventProc);
        eventThreads.push_back(th);
    }

    // create listen socket
    listenSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
    // bind listen socket to i/o completion port
    CreateIoCompletionPort((HANDLE)listenSocket, completionPort, (ULONG_PTR)0, 0);

    // bind socket
    SOCKADDR_IN srvAddr;
    srvAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    srvAddr.sin_family = AF_INET;
    srvAddr.sin_port = htons(config.listenPort);
    int result = bind(listenSocket, (SOCKADDR*)&srvAddr, sizeof(SOCKADDR));
    if (SOCKET_ERROR == result)
    {
        Log::e("Bind failed. Error: %d", GetLastError());
        return -1;
    }

    // start listen
    result = listen(listenSocket, NUM_ACCEPTEX);
    if (SOCKET_ERROR == result)
    {
        Log::e("Listen failed. Error: %d", GetLastError());
        return -1;
    }
    Log::i("server is listening port %d, waiting for clients...", config.listenPort);

    //AcceptEx function pointer
    lpfnAcceptEx = NULL;
    //AcceptEx function GUID
    GUID guidAcceptEx = WSAID_ACCEPTEX;
    //get acceptex function pointer
    DWORD dwBytes = 0;
    result = WSAIoctl(listenSocket, SIO_GET_EXTENSION_FUNCTION_POINTER,
                      &guidAcceptEx, sizeof(guidAcceptEx), &lpfnAcceptEx, sizeof(lpfnAcceptEx),
                      &dwBytes, NULL, NULL);
    if (result != 0)
    {
        Log::e("WSAIoctl get AcceptEx function pointer failed... %d", WSAGetLastError());
        return -1;
    }

    //post acceptEx
    for (int i = 0; i < NUM_ACCEPTEX; ++i)
    {
        postAcceptEx();
    }
    return 0;
}	//end of startListen