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); } } }
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