int Session::on_read_event() { int ret; while (true) { if (!m_has_head) { ret = read_head(); if (ret < 0) { return -1; } if (ret == SESSION_RET_NO_DATA) { return 0; } if (m_msg_type == MSG_HEART_BEAT) { if (g_is_master) { update_active_time(); } else { struct commu_msg msg; msg.ip = get_cli_addr(); msg.msg = MSG_HEART_BEAT; notify_master(msg); } continue; } m_has_head = true; m_buff = (u_char *)glb_mempool()->get(m_msg_len); } int n_read = readn(m_sockfd, &m_buff[m_n_read], m_msg_len - m_n_read); if (n_read < 0) { logerr("socket broken\n"); m_msg_len = 0; m_has_head = false; return -1; } m_n_read += n_read; if (m_n_read == m_msg_len) { write_msg(m_buff, m_msg_len); reset_buffer(); } } return 0; }
int main(int argc, char *argv[]) { struct sockaddr *cli, *srv; int is_stream, s, cli_len, srv_len; is_xia = check_cli_params(&is_stream, argc, argv); if (is_stream) { /* XXX Implement stream support. */ printf("Stream support not implemented.\n"); exit(1); } s = any_socket(is_xia, is_stream); assert(s >= 0); cli = get_cli_addr(is_xia, argc, argv, &cli_len); assert(cli); srv = get_srv_addr(is_xia, argc, argv, &srv_len); assert(srv); any_bind(is_xia, 0, s, cli, cli_len); cork(s); while (1) { char input[512]; int n_read = read_command(input, sizeof(input)); if (n_read <= 0) break; if (is_file(input)) { if (bytes_corked) empty_cork(s, srv, srv_len, stdout, 0); datagram_process_file(s, srv, srv_len, input + 3, CORK_SIZE, CORK_TIMES, mark); printf("\n"); } else { process_text(s, srv, srv_len, input, n_read); } printf("\n"); } free(srv); free(cli); assert(!close(s)); return 0; }