打印
[ZLG-ARM]

(转)ARM Linux环境下多连接TCP服务器编程示例

[复制链接]
2352|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
高亮登录|  楼主 | 2012-1-17 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TCP Socket编程
在进行网络应用程序开发方面大多是采用套接字Socket技术,嵌入式Linux的系统平台上也是如此。Socket编程的基本函数有socket( )、bind( )、listen( )、accept( )、send( )、sendto( )、recv( )、recvfrom( )、connect( )等。

支持多连接的TCP服务器应用示例
Step3_TCPServe是一个支持多个客户端的连接TCPServer示例,该例程采用了面向对象的C++编程,创建了CTCPServer和CTCPCustom两个类,其中CTCPServer类负责侦听客户端的连接,一旦有客户端请求连接,它就负责接受此连接,并创建一个新的CTCPCustom类对象与客户端进行通讯,然后CTCPServer类接着监听客户端的连接请求,其流程如下:
        CTCPServer类
CTCPServer类定义在TCPServer.h文件下,该类提供了3个公共函数,以及一个Socket侦听线程,公共的函数中Open( )、Close( )用于启动或是关闭TCP服务。
        class CTCPServer
        {
        private:
                pthread_t m_thread; //通讯线程标识符ID
                //Socket侦听线程

                static int SocketListenThread( void*lparam );
        public:
                int m_sockfd; //TCP服务监听socket
                int m_ExitThreadFlag;
                int m_LocalPort; //设置服务端口号
                CTCPServer();
                virtual ~CTCPServer();
                int Open(); // 打开TCP服务
                int Close(); // 关闭TCP服务
                // 删除一个客户端对象连接 释放资源
                int RemoveClientSocketObject( void* lparam );
        };
        在Open( )函数中实现了打开套接字,将套接字设置为侦听套接字,并创建侦听客户端连接线程。在Linux应用程序中创建线程的方法在《嵌入式Linux串口通讯的C++设计》中有相关的说明,在该例程中也是采取的同样方式。
        SocketListenThread函数中调用select( )侦听客户端的TCP连接,流程如下:
        同样的需要注意的是,select( )函数中的时间参数在Linux下每次都需要重新赋值,否则会自动归0。CTCPServer类的实现代码请参见TCPServer.CPP文件。

相关帖子

沙发
高亮登录|  楼主 | 2012-1-17 13:14 | 只看该作者
CTCPCustom类
CTCPCustom的定义在TCPCustom.h文件下。
        class CTCPCustom
        {
        public:
                CTCPCustom();
                virtual ~CTCPCustom();
        public:
                char m_RemoteHost[100]; //远程主机IP地址
                int m_RemotePort; //远程主机端口号
                int m_socketfd; //通讯socket
                int m_SocketEnable;
                int m_ExitThreadFlag;
                CTCPServer* m_pTCPServer;
        private:
                // 通讯线程函数
                pthread_t m_thread; //通讯线程标识符ID
                static void* SocketDataThread(void* lparam); //TCP连接数据通讯线程
        public:
                int RecvLen;
                char RecvBuf[1500];
                // 打开socket,创建通讯线程
                int Open(void* lparam);
                // 关闭socket,关闭线程,释放Socket资源
                int Close();
                // 向客户端发送数据
                int SendData(const char * buf , int len );
        };
        其中的SocketDataThread函数是实现TCP连接数据通讯的核心代码,在该函数中调用select( )等待TCP连接的通讯数据,对于接收的TCP连接数据的处理也是在该函数中实现,在本例程中处理为简单的数据回发,用户可结合实际的应用修改此处代码,流程如下:
        CTCPServer类的调用
CTCPSerer类的具体使用也比较简单,主要是调用对于类中定义Open函数来启动各个TCP通讯线程,反而在主循环中需要实现的功能代码不多了,在本例程中仅仅为每隔1s输出提示信息。以下为Step3_TCPServer.cpp中的相关代码。
        class CTCPServer m_TCPServer;
        int main()
        {
                int i1;
                printf( ''Step3_TCPTest V1.0\n'' );
                // 给TCP服务器端口赋值
                m_TCPServer.m_LocalPort = 1001;
                // 创建Socket,启动TCP服务器侦听线程
                i1 = m_TCPServer.Open( );
                if( i1<0 )
                {
                        printf( ''TCP Server start fail\n'');
                        return -1;
                }
                // 进入主循环,主要是负责管理工作
                for( i1=0; i1<10000;i1++) //实际应用时,可设置为无限循环
                {
                        sleep(1);
                        printf( ''%d \n'', i1+1);
                }
                m_TCPServer.Close( );
                return 0;
        }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

117

帖子

1

粉丝