コード例 #1
0
ファイル: session.cpp プロジェクト: adan830/simplesvr
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;

}
コード例 #2
0
ファイル: eclicork.c プロジェクト: AltraMayor/net-echo
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;
}