main(int argc, char **argv) { if (argc < 2) return 0; int port; if (sscanf(argv[1], "%d", &port) != 1) return 0; sockaddr_in serv; int sd = NewSock(); if (sd < 0 || Bind(sd, port) < 0) return -1; while(1) { if (!Ready(sd, -1)) continue; char mes[516]; sockaddr_in client; socklen_t c_len = sizeof(client); int l = recvfrom(sd, mes, 516, 0, (struct sockaddr *)&client, &c_len), stat; pid_t sub; while (qn > 0 && (sub = waitpid(-1, &stat, WNOHANG))) Dequeue(sub); if (Inqueue(client)) { fprintf(stderr, "get op = %d\n", *(short *)mes); continue; } sub = fork(); if (!sub) { Serve(mes, client); _exit(0); } Enqueue(client, sub); } }
void Server::ServeClient(Socket& clientSocket) { try { { std::lock_guard<std::mutex> guard(stdoutMutex); std::cout << "Serving new client...\n"; } Serve(clientSocket); { std::lock_guard<std::mutex> guard(stdoutMutex); std::cout << "Client served..\n"; } } catch(const std::exception& e) { std::lock_guard<std::mutex> guard(stderrMutex); std::cerr << e.what() << '\n'; } catch(...) { std::lock_guard<std::mutex> guard(stderrMutex); std::cerr << "Unexpected error!\n"; } clientSocket.Close(); }
void Server::ServeClient(std::shared_ptr<ISocket> clientSocket) { try { Serve(clientSocket); } catch(const std::exception& e) { std::lock_guard<std::mutex> guard(stderrMutex); std::cerr << e.what(); } clientSocket->Close(); }
int main( int argc, char * const argv[] ) { char * socket_name; if(argc == 1) { //const char * const socket_name = "/tmp/server/socket\0"; socket_name = "/tmp/server/socket\0"; } else socket_name = argv[1]; //printf("%s\n",argv[1]); int socket_fd; struct sockaddr_un name; bool serving = true; // 创建套接字 socket_fd = socket( PF_LOCAL, SOCK_STREAM, 0 ); // 设定服务器性质 name.sun_family = AF_LOCAL; strcpy( name.sun_path, socket_name ); //strcpy( name.sun_path, argv[1] ); // 绑定套接字 bind( socket_fd, (struct sockaddr *)&name, SUN_LEN( &name ) ); // 侦听客户连接 listen( socket_fd, 5 ); // 重复接受连接,直到某个客户发出“quit”消息 while( serving ) { struct sockaddr_un client_name; socklen_t client_name_len; int client_socket_fd; // 接受客户连接请求 client_socket_fd = accept( socket_fd, (struct sockaddr *)&client_name, &client_name_len ); serving = Serve( client_socket_fd ); // 服务连接请求 close( client_socket_fd ); // 关闭客户连接 } close( socket_fd ); unlink( socket_name ); // 删除套接字文件 return 0; }
//!alias for Serve() void ServeInThisThread(short Port){Serve(Port);}
int Spy::Bootstrap() { if (m_serial.Setup() != ERR_NONE) { info("Spy error: cannot open serial port\n"); return 0; } info("Sending bootstrap code to workstation %d\n", m_studentNo); uint16_t bootStart, bootEnd; // Phase 1: send and run bootstrap code { char path[strlen(m_ExePath) + strlen(STRAPON) + 2]; sprintf(path, "%s/%s", m_ExePath, STRAPON); FILE* file = fopen(path, "rb"); uint8_t sig; if (file == 0 || fread(&sig, 1, 1, file) != 1) { info("Cannot read %s\n", path); return 0; } if (sig != 0xfe) { info("Not a BIN file %s\n", path); return 0; } BasicSender basicSender(&m_serial, m_studentNo); if (!basicSender.SendCommand(" WIDTH 80:COLOR9,1")) { info("Could not send command\n"); return 0; } sleep(2); if (!basicSender.sendBIN(file, &bootStart, &bootEnd, 0)) { info("Bootstrap code upload error\n"); return 0; } } info("Waiting for remote party..."); sleep(1); info("OK\n"); // Phase 2: upload memories SpyTransport transport(&m_serial); { info("Uploading zero page\n"); // Zero page transport.SendMemory(m_MSXRAM + 0x0000, 0x0000, 256); // MSX-DOS BDOS area .. 0xED00 uint16_t start = m_MSXRAM[6] | (m_MSXRAM[7] << 8); int length = bootStart - start; // patch the stupid loaded flag in MSXDOS+1A m_MSXRAM[(start & 0xff00) + 0x1A] = 0; if (length > 0) { info("Uploading memory area %04x-%04x\n", start, start + length); transport.SendMemory(m_MSXRAM + start, start, length); usleep(20000); // 0xED00 + sizeof(Bootstrap) .. EndOfWorkArea start = bootEnd; } length = 0xf380 - start; info("Uploading memory area %04x-%04x\n", start, start + length); transport.SendMemory(m_MSXRAM + start, start, length); usleep(20000); // Net BDOS info("Uploading NetBDOS area %04x-%04x\n", 0xe900, 0xe900 + m_BDOSSize); transport.SendMemory(m_BDOS, 0xe900, m_BDOSSize); } // Phase 3: upload file to TPA if specified if (m_nfiles > 0) { int comsize; info("Uploading TPA file %s\n", m_file[0]); if ((comsize = loadFile(m_file[0], &m_COMFile, -1)) != 0) { transport.SendMemory(m_COMFile, 0x100, comsize); } } info("Launching remote workstation\n"); // Phase 3: Launch remote station transport.SendCommand(2); sleep(1); return Serve(); }