static void start_connection( struct timeval* nowP ) { int cnum, url_num; /* Find an empty connection slot. */ for ( cnum = 0; cnum < max_connections; ++cnum ) if ( connections[cnum].conn_state == CNST_FREE ) { /* Choose a URL. */ url_num = ( (unsigned long) random() ) % ( (unsigned int) num_urls ); /* Start the socket. */ start_socket( url_num, cnum, nowP ); if ( connections[cnum].conn_state != CNST_FREE ) { ++num_connections; if ( num_connections > max_parallel ) max_parallel = num_connections; } ++fetches_started; return; } /* No slots left. */ (void) fprintf( stderr, "%s: ran out of connection slots\n", argv0 ); finish( nowP ); }
static void start_connection(struct timeval* nowP) { int cnum, url_num; /* Find an empty connection slot. */ for (cnum = 0; cnum < max_connections; ++cnum) { if (__builtin_expect(connections[cnum].conn_state == CNST_FREE, 1)) { /* Choose a URL. */ url_num = pick_url(); /* Start the socket. */ start_socket(url_num, cnum, nowP); if (connections[cnum].conn_state != CNST_FREE) { ++num_connections; if (num_connections > max_parallel) max_parallel = num_connections; } ++fetches_started; return; } } /* No slots left. */ (void)fprintf(stderr, "%s: ran out of connection slots\n", argv0); finish(nowP); }
int CMySocket::init(std::string listen_ip, uint16 listen_port) { //1 start if (!start_socket()) { return -1; } m_listen_ip = listen_ip; m_listen_port = listen_port; return 0; }
// return type static int ctrl_cmd(struct socket_server *ss, struct socket_message *result) { int fd = ss->recvctrl_fd; // the length of message is one byte, so 256+8 buffer size is enough. uint8_t buffer[256]; uint8_t header[2]; block_readpipe(fd, header, sizeof(header)); int type = header[0]; int len = header[1]; block_readpipe(fd, buffer, len); // ctrl command only exist in local fd, so don't worry about endian. switch (type) { case 'S': return start_socket(ss,(struct request_start *)buffer, result); case 'B': return bind_socket(ss,(struct request_bind *)buffer, result); case 'L': return listen_socket(ss,(struct request_listen *)buffer, result); case 'K': return close_socket(ss,(struct request_close *)buffer, result); case 'O': return open_socket(ss, (struct request_open *)buffer, result); case 'X': result->opaque = 0; result->id = 0; result->ud = 0; result->data = NULL; return SOCKET_EXIT; case 'D': return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_HIGH, NULL); case 'P': return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_LOW, NULL); case 'A': { struct request_send_udp * rsu = (struct request_send_udp *)buffer; return send_socket(ss, &rsu->send, result, PRIORITY_HIGH, rsu->address); } case 'C': return set_udp_address(ss, (struct request_setudp *)buffer, result); case 'T': setopt_socket(ss, (struct request_setopt *)buffer); return -1; case 'U': add_udp_socket(ss, (struct request_udp *)buffer); return -1; default: fprintf(stderr, "socket-server: Unknown ctrl %c.\n",type); return -1; }; return -1; }
int socket_server::ctrl_cmd(struct socket_message * result) { int fd = recvctrl_fd; uint8_t buffer[256]; uint8_t header[2]; block_readpipe(fd, (void *)header, sizeof(header)); int type = header[0]; int len = header[1]; block_readpipe(fd, buffer, len); switch (type) { case 'S': return start_socket((struct request_start *)buffer, result); case 'B': return bind_socket((struct request_bind *)buffer, result); case 'L': return listen_socket((struct request_listen *)buffer, result); case 'K': return close_socket((struct request_close *)buffer, result); case 'O': return open_socket((struct request_open *)buffer, result);; case 'X': result->opaque = 0; result->ud = 0; result->id = 0; result->data = nullptr; return SOCKET_EXIT; case 'D': printf("*****************send data*******************\n"); return send_socket((struct request_send *)buffer, result, PRIORITY_HIGH); case 'P': break; case 'A': break; case 'C': break; case 'T': setopt_socket((struct request_setopt *)buffer); return -1; case 'U': break; default: fprintf(stderr, "socket-server: unknown ctrl %c.\n", type); break; } return -1; }
int main(int argc, char *argv[]) { if(argc < 3) { printf("Invalid argemnet\r\n"); help(); return 0; } port = atoi(argv[1]); memset(file_path, 0, sizeof(file_path)); memcpy(file_path, argv[2], strlen(argv[2])); start_socket(); return 0; }
// return type // 执行管道指令,写入socket_message static int ctrl_cmd(struct socket_server *ss, struct socket_message *result) { int fd = ss->recvctrl_fd; // the length of message is one byte, so 256+8 buffer size is enough. // 读管道数据,相反的数据写入管道逻辑见send_request方法 // len长度1个字节,所以缓冲区的长度为256足够 uint8_t buffer[256]; uint8_t header[2]; // 先读2字节的头 block_readpipe(fd, header, sizeof(header)); int type = header[0]; int len = header[1]; // 再读剩余数据部分 block_readpipe(fd, buffer, len); // ctrl command only exist in local fd, so don't worry about endian. switch (type) { case 'S': // PACCEPT -> CONNECTED // PLISTEN -> LISTEN // 把套接字加入事件循环 return start_socket(ss,(struct request_start *)buffer, result); case 'B': // 绑定套接字 return bind_socket(ss,(struct request_bind *)buffer, result); case 'L': // 监听套接字 return listen_socket(ss,(struct request_listen *)buffer, result); case 'K': // 关闭套接字 return close_socket(ss,(struct request_close *)buffer, result); case 'O': // 打开套接字 return open_socket(ss, (struct request_open *)buffer, result); case 'X': // 退出套接字 result->opaque = 0; result->id = 0; result->ud = 0; result->data = NULL; return SOCKET_EXIT; case 'D': // 发送高优先级数据 return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_HIGH, NULL); case 'P': // 发送低优先级数据 return send_socket(ss, (struct request_send *)buffer, result, PRIORITY_LOW, NULL); case 'A': { struct request_send_udp * rsu = (struct request_send_udp *)buffer; return send_socket(ss, &rsu->send, result, PRIORITY_HIGH, rsu->address); } case 'C': return set_udp_address(ss, (struct request_setudp *)buffer, result); case 'T': // 设置套接字 setopt_socket(ss, (struct request_setopt *)buffer); return -1; case 'U': add_udp_socket(ss, (struct request_udp *)buffer); return -1; default: fprintf(stderr, "socket-server: Unknown ctrl %c.\n",type); return -1; }; return -1; }
int main(int argc, char** argv) { printf("haltestelle built <%s %s> version %s\n", __DATE__, __TIME__, VERSION); if(argc < 5) { fprintf(stderr, "usage: %s <designation> <busfarhn_host> <busfarhn_port> <serialport>\n", argv[0]); exit(-1); } /*global*/ designation = argv[1]; /*global*/ busfarhn_host = argv[2]; /*global*/ busfarhn_port = atoi(argv[3]); char* serialport = argv[4]; /*global*/ sockfd = start_socket(); if(connect_to_busfarhn(designation) != 0) { fprintf(stderr, "[ERROR] connecting to %s:%d failed\n", busfarhn_host, busfarhn_port); return -1; } #ifdef USE_SERIAL #ifdef SERIAL_IS_A_FILE printf("%s is a FILE\n", serialport); #elif defined SERIAL_IS_A_ATH0 printf("%s is a SERIAL PORT (ATH style)\n", serialport); #else printf("%s is a SERIAL PORT\n", serialport); #endif #else printf("WARNING: NOT USING THE SERIAL PORT\n"); #endif printf("[STARTUP] connected to %s:%i with designation %s\n", busfarhn_host, busfarhn_port, designation); #ifdef USE_SERIAL #ifdef SERIAL_IS_A_FILE /*global*/ serialfd = fopen(serialport, "rw"); #elif defined SERIAL_IS_A_ATH0 /*global*/ serialfd = open(serialport, O_RDWR); #else /*global*/ serialfd = open(serialport, O_RDWR | O_NOCTTY | O_SYNC); #endif if (serialfd < 0) { fprintf(stderr, "error %d opening %s: %s", errno, serialport, strerror (errno)); return; } #if !(defined SERIAL_IS_A_FILE || defined SERIAL_IS_A_ATH0) set_interface_attribs (serialfd, SERIAL_BAUDRATE, 0); // set speed to 115,200 bps, 8n1 (no parity) set_blocking (serialfd, 0); // set no blocking #endif #endif hs_startup(); char netbuf[MAXBUFLEN]; unsigned int netbufpos = 0; struct sockaddr_storage their_addr; socklen_t addr_len; #ifdef USE_SERIAL pthread_t pth; pthread_create(&pth, NULL, thread_read_serial, NULL); #endif while(1) { // network int numbytes; addr_len = sizeof their_addr; if ((numbytes = recvfrom(sockfd, (netbuf + netbufpos), MAXBUFLEN - (netbufpos + 1), MSG_DONTWAIT, (struct sockaddr *)&their_addr, &addr_len)) > 0) { printf("[NET] received %i bytes\n", numbytes); int i = 0; for(i = 0; i < numbytes; i++) if(netbuf[netbufpos + i] == '\n') break; netbufpos += numbytes; if(i < numbytes) { // found breakline netbuf[netbufpos - 1] = '\0'; netbufpos = 0; printf("CMD <%s>\n", netbuf); JSON_Value* json = json_parse_string(netbuf); if(json_value_get_type(json) == JSONObject) { JSON_Object* obj = json_value_get_object(json); const char* msgtype = json_object_dotget_string(obj, "type"); if(strcmp(msgtype, "io.tcp.ping") == 0) do_ping(); else do_network(json, netbuf); } json_value_free(json); } if(netbufpos + 1 == MAXBUFLEN) { printf("[NET] ERROR: received %i bytes and still no breakline. Discarding the message.\n", MAXBUFLEN); netbufpos = 0; } } else if(numbytes == 0) { break; } } hs_shutdown(); close(sockfd); return 0; }
int main(){ HWND hwnd = GetConsoleWindow(); ShowWindow(hwnd,SW_MAXIMIZE); console_settings(); console_resize(3); login=fopen("save\\logins.dat","rb"); if(login==NULL) admin_settings_signup(); else admin_settings_signin(); main_menu(); start_socket(); start_server(); handleAccept = (HANDLE) _beginthread(thd_accept_connections,0,0); handleMessages = (HANDLE) _beginthread(thd_program_messages,0,0); //clientHandle = (HANDLE) _beginthread( thd_receive_data,0,0); while(1){ // The interface part switch(getch()){ case '1': if(flag_menu==0) requests(); else if(flag_menu==2) services(); else if(flag_menu==21) add_services(); else if(flag_menu==22) setcost(); else if(flag_menu==24) change_password(); break; case '2': if(flag_menu==0) settings(); else if(flag_menu==2) cost(); else if(flag_menu==22) viewcost(); else if(flag_menu==21) view_services(); break; case '3': if(flag_menu==0){ saveMessagesToFile(); exit(0); } else if(flag_menu==2) member_settings_signup(); else if(flag_menu==21) edit_services(); break; case '4': if(flag_menu==21) search_services(); else if(flag_menu==2) admin_settings(); break; case '5': if(flag_menu==21) delete_services(); break; case 'r': if(flag_menu == 0) flag_reset = true; main_menu(); break; case 27: if(flag_menu==2 || flag_menu==1 ) main_menu(); else if(flag_menu==21) settings(); else if( flag_menu==22) settings(); else if(flag_menu==23) settings(); else if(flag_menu==24) settings(); else if(flag_menu==211) services(); else if(flag_menu==212) services(); else if(flag_menu==213) services(); else if(flag_menu==214) services(); else if(flag_menu==215) services(); else if(flag_menu==221 || flag_menu==222) cost(); break; default: break; } } return 0; }