⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rpcsrv.c

📁 PB 熟悉的哥们希望大家可以互相学习一下
💻 C
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WIN32_WCE
    #include <errno.h>
#endif

#ifdef _VXWORKS
    #include <ioLib.h>
    #define MSG_NOSIGNAL 0
#endif 

#ifndef WIN32
    #include <unistd.h>
#endif 

#include "rpcsds.h"
#include "test_intf.h"
#include "test_intf_server.h"

#ifndef _WIN32_WCE
	#include <sys/types.h>
#else
#define EINTR WSAEINTR
#define errno h_errno
#endif

#ifdef _SOLARIS
    #include <stropts.h>
#endif 


#define DATA_THROUGH_A_NETWORK

//#define DATA_THROUGH_A_FILE

#ifdef DATA_THROUGH_A_FILE
    typedef struct tag_test_params
    {
        FILE* w;
        FILE* r;
    } test_params_t, * test_params_p;

    int test_intf_write_stream(void* buf_, unsigned int buf_sz, void* param, unsigned int network_order)
    {

        char* buf = buf_;
        unsigned int i;
        for (i = 0; i < buf_sz; i++)
        {
            printf("%02hhx ", buf[i]);
        };
        printf("\n");

        fwrite(buf_, 1, buf_sz, ((test_params_p)param)->w);

        return 0;
    };

    int test_intf_read_stream(void* buf_, unsigned int buf_sz, void* param, unsigned int network_order, unsigned int*
                              read_sz)
    {

        char* buf = buf_;
        unsigned int i;

        *read_sz = fread(buf_, 1, buf_sz, ((test_params_p)param)->r);

        for (i = 0; i < buf_sz; i++)
        {
            printf("%02hhx ", buf[i]);
        };
        printf("\n");

        return 0;
    };

    int test_intf_is_data_available(mco_rpc_context_p ctx, unsigned int* result)
    {

        /*
        char buf[100];
        printf( "mco_rpc_is_data_available?" ); fgets( buf, sizeof(buf), stdin );
         */

        return 0;
    };
#endif 

#ifdef DATA_THROUGH_A_NETWORK

    #ifndef WIN32
        #include <sys/socket.h>
        #include <sys/ioctl.h>
        #include <netinet/tcp.h>
        #include <netinet/in.h>
        #include <arpa/inet.h>
        #if defined(_HPUX) || defined(_SOLARIS) || defined(_QNX)
            #define MSG_NOSIGNAL 0
        #endif 
    #else 
        #include <winsock2.h>
        #define MSG_NOSIGNAL 0
    #endif 

    #define CONNECTION_POOL	5
    #define CONNECTION_ACCEPT_TIMEOUT_SEC  0
    #define CONNECTION_ACCEPT_TIMEOUT_USEC 300*1000

    typedef struct tag_test_params
    {

        int tl[CONNECTION_POOL + 1];
        unsigned int data_connection_i;

    } test_params_t, * test_params_p;

    int mco_init_network_server_interface(test_params_p nctx, char* intf, unsigned short port)
    {

        unsigned int i;
        struct sockaddr_in sin;

        #ifdef WIN32
            WSADATA wsa;
            int r = WSAStartup(MAKEWORD(2, 0), &wsa);
            if (r != 0)
            {
                WSACleanup();
                return 1;
            };
        #endif 


        nctx->data_connection_i = 0;
        nctx->tl[0] = (int)socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

        for (i = 1; i < sizeof(nctx->tl) / sizeof(nctx->tl[0]); i++)
        {
            nctx->tl[i] =  - 1;
        };

        /* make the first socket to listen for incoming connections */
        sin.sin_family = AF_INET;
        sin.sin_port = htons(port);
        sin.sin_addr.s_addr = inet_addr(intf);

        if (bind(nctx->tl[0], (struct sockaddr*) &sin, sizeof(sin)) ==  - 1)
        {
            return 1;
        }

        if (listen(nctx->tl[0], SOMAXCONN) ==  - 1)
        {
            return 2;
        }

        return 0;
    };

    int mco_clear_network_server_interface(test_params_p nctx)
    {

        unsigned int i;

        for (i = 0; i < sizeof(nctx->tl) / sizeof(nctx->tl[0]); i++)
        {

            if (nctx->tl[i] >= 0)
            {
                #ifndef WIN32  
                    #ifdef _VXWORKS
                        shutdown(nctx->tl[i], 0);
                    #else 
                        shutdown(nctx->tl[i], SHUT_RDWR);
                    #endif 
                    close(nctx->tl[i]);
                #else /* WIN32 */
                    shutdown(nctx->tl[i], SD_BOTH);
                    closesocket(nctx->tl[i]);
                #endif /* WIN32 */
            };
        };

        #ifdef WIN32  
            WSACleanup();
        #endif /* WIN32 */

        return 0;
    };

    int test_intf_is_data_available(mco_rpc_context_p ctx, unsigned int* result)
    {

        unsigned int i, j;
        test_params_p nctx = (test_params_p)ctx->param;
        struct timeval tv;
        fd_set fds;
        int res;
        int maxsockval = 0;
        struct sockaddr_in saddr;

        *result = 0;

        saddr.sin_family = AF_INET;
        saddr.sin_addr.s_addr = INADDR_ANY;
        saddr.sin_port = htons(8082);

        tv.tv_sec = CONNECTION_ACCEPT_TIMEOUT_SEC;
        tv.tv_usec = CONNECTION_ACCEPT_TIMEOUT_USEC;


        /* zeroing fd's */
        FD_ZERO(&fds);

        /* setting the open sockets */
        for (i = 0; i < sizeof(nctx->tl) / sizeof(nctx->tl[0]); i++)
        {

            if (nctx->tl[i] >= 0)
            {

                FD_SET((unsigned int)nctx->tl[i], &fds);
                if (nctx->tl[i] > maxsockval)
                {
                    maxsockval = nctx->tl[i];
                }
            } 

        }


        /* wait for events on open sockets */
        while ((res = select(maxsockval + 1, &fds, 0, 0, &tv)) < 0)
        {
            if (errno != EINTR)
            {
                break;
            }
        }

        /* return if error or timeout */
        if (res <= 0)
        {
            return res;
        }

        /* request sockets */
        for (i = 0; i < sizeof(nctx->tl) / sizeof(nctx->tl[0]); i++)
        {
            unsigned int rcvd = 0;

            if (nctx->tl[i] < 0)
            {
                continue;
            }

            if (!(FD_ISSET(nctx->tl[i], &fds)))
            {
                continue;
            }

            if (i == 0)
            {
                /* listener socket */
                /* find free element of the array & accept the connection */
                for (j = 1; j < sizeof(nctx->tl) / sizeof(nctx->tl[0]); j++)
                {
                    if (nctx->tl[j] < 0)
                    {
                        res = sizeof(saddr);
                        nctx->tl[j] = (int)accept(nctx->tl[0], (struct sockaddr*) &saddr,  &res);
                        break;
                    }
                }
            }
            else
            {

                #ifdef WIN32  
                    res = ioctlsocket(nctx->tl[i], FIONREAD, &rcvd);
                #else /* WIN32 */
                    #ifdef _SOLARIS
                        res = ioctl(nctx->tl[i], I_NREAD, &rcvd);
                    #else 
                        res = ioctl(nctx->tl[i], FIONREAD, &rcvd);
                    #endif 
                #endif 
                #ifdef _SOLARIS
                    if (res)
                    {
                    #else 
                        if (res == 0)
                        {
                        #endif 

                        nctx->data_connection_i = i;
                        *result = 1;
                        return 0;
                    };

                }

            }

            return 0;
        };

        int test_intf_write_stream(void* buf_, unsigned int buf_sz, void* param, unsigned int network_order)
        {

            test_params_p nctx = (test_params_p)param;
            char* buf = buf_;
            unsigned int i;

            if (nctx->data_connection_i == 0)
            {
                return 1;
            }

            for (i = 0; i < buf_sz; i++)
            {
                printf("%02hhx ", buf[i]);
            };
            printf("\n");

            if ( - 1 == send(nctx->tl[nctx->data_connection_i], buf_, buf_sz, MSG_NOSIGNAL))
            {
                return 1;
            }

            return 0;
        };

        int test_intf_read_stream(void* buf_, unsigned int buf_sz, void* param, unsigned int network_order, unsigned
                                  int* read_sz)
        {

            test_params_p nctx = (test_params_p)param;
            char* buf = buf_;
            unsigned int i;

            if ( - 1 == ((*read_sz) = recv(nctx->tl[nctx->data_connection_i], buf_, buf_sz, MSG_NOSIGNAL)))
            {
                return 1;
            }

            for (i = 0; i < buf_sz; i++)
            {
                printf("%02hhx ", buf[i]);
            };
            printf("\n");

            return 0;
        };

    #endif 

    void mco_rpc_fatal_error(int e)
    {

        printf("Fatal error: %d\n", e);
        exit(1);
    };

    extern mco_rpc_context_t test_intf_ctx;

    int test_int(int i)
    {

        return i | 0x5555AAAA;
    };

    void test_void_int(int i){

    }
    ;

    int test_int_string(char* s)
    {

        return atoi(s);
    };

    int test_int_int5(int5 ints)
    {

        return ints[0] + ints[1] + ints[2] + ints[3] + ints[4];
    };

    int test_int_pstruct(test_struct_p pstruct)
    {

        return pstruct->a;
    };

    int test_int_variable_len(test_struct_variable_p p)
    {
        return p->a_sz + p->b_len;
    };

    int test_int_union(test_struct_union_p p)
    {

        return p->tp;
    };

    int hit_test()
    {

        struct timeval tv;
        fd_set fds;

        tv.tv_sec = 0;
        tv.tv_usec = 1000;

        FD_ZERO(&fds);
        FD_SET(0, &fds);

        return select(1, &fds, 0, 0, &tv) > 0 ? 1 : 0;
    };

    int main(int argc, char* argv[])
    {

        int r = 0;
        int test_Mode = 0;
        test_params_t params;
        test_intf_ctx.param = &params;
        #ifndef WIN32
            if (argc > 1 && strstr(argv[1], "--test"))
            {
                test_Mode = 1;
            }
        #endif //

        #ifdef DATA_THROUGH_A_FILE
            params.r = fopen("test1_w.bin", "r");
            params.w = fopen("test1_r.bin", "w");

            while (r == 0)
            {
                printf("%d\n", r = test_intf_dispatch());
            };

            if (params.w)
            {
                fclose(params.w);
            }
            if (params.r)
            {
                fclose(params.r);
            }
        #endif 

        #ifdef DATA_THROUGH_A_NETWORK
            if (0 != mco_init_network_server_interface(&params, "0.0.0.0", 8082))
            {
                printf("Unable to start the server\n");
                return 1;
            };

            while (test_Mode || (r == 0 && 0 == hit_test()))
            {
                printf("%d\n", r = test_intf_dispatch());
            };

            mco_clear_network_server_interface(&params);
        #endif 

        return 0;
    };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -