linux IO复用,可检测一切文件描述符(字符设备,块设备,串口)php版本,随意加网页

 下面是c语言select版本监听socket和一个串口,看起来是那么的熟悉。


int create_socket(void)
{
        fd_set  readfd; //读文件描述符集合
        int ret;
        STRU_MSG_HEAD msg_head;
        int len;
        char buf[SIZE]; //接收网络数据缓冲区6K

        memset(&server_addr, 0, sizeof(server_addr));

        /* 初始化网络信息*/
        server_addr.sin_family      = AF_INET;          //设置为IP通信
        server_addr.sin_addr.s_addr = INADDR_ANY;       //无限制
        server_addr.sin_port        = htons(8000);

        if ((server_sockfd = socket(PF_INET,SOCK_DGRAM,0)) < 0) {
                ERROR("socket error\n");
                return -1;
        }

        if(bind(server_sockfd, (struct sockaddr *)&server_addr, 
                                sizeof(struct sockaddr)) < 0) {
                ERROR("bind error\n");
                return -1;
        }

        sin_size = sizeof(struct sockaddr_in);
       
        for(;;) {
                /* 接收消息*/
                bzero(buf, SIZE);
                FD_ZERO(&readfd);
                FD_SET(zigbeefd, &readfd);
                FD_SET(server_sockfd, &readfd);
                
                ret = select(server_sockfd + 1, &readfd, NULL, NULL, NULL); 
                if (ret == -1) 
                        perror("select:");
                else if (ret == 0) 
                        printf("timeout.\n");
                else if (FD_ISSET(zigbeefd, &readfd)) {
                        printf("have a uart data...........\n");
                        if (read(zigbeefd, buf, SIZE) < 0) {
                                ERROR("read zigbee error\n");
                                continue;
                        }
                } else if (FD_ISSET(server_sockfd, &readfd)) {
                        printf("have a net data...........\n");
                        if((len = recvfrom(server_sockfd, buf, SIZE, 0, 
                                                        (struct sockaddr*)&client_addr, &sin_size)) < 0) {
                                ERROR("receive packet error\n");
                                continue;
                        }
                }
                /* 消息处理
                 * 解析消息头
                 * 分发消息
                 * */
                memcpy(&msg_head, buf, sizeof(msg_head));
                switch(msg_head.u16MsgType) {
                        /* 查看系统信息请求*/
                        case O_MCMMAIN_MACHINE_INFO_QUERY_REQ:
                                get_machine_info_req(buf);
                                break;

                        /* 设置寄存器请求*/
                        case O_MCMMAIN_SET_REGISTER_DATA_REQ:
                                set_register_data_req(buf);
                                break;
                        
                        /* 查询寄存器请求*/
                        case O_MCMMAIN_GET_REGISTER_DATA_REQ:
                                get_register_data_req(buf);
                                break;

                        /* 设置EEPROM请求*/
                        case O_MCMMAIN_SET_EEPROM_DATA_REQ:
                                set_eeprom_data_req(buf);
                                break;

                        /* 查询EEPROM请求*/
                        case O_MCMMAIN_GET_EEPROM_DATA_REQ:
                                get_eeprom_data_req(buf);
                                break;

                        /* 软件更新请求 */
                        case O_MCMMAIN_SOFTWARE_UPDATE_REQ:
                                software_update_req(buf);
                                break;

                        /* 发送短信息请求*/
                        case O_MCMMAIN_MODEM_REQ:
                                send_gprs_message_req(buf);
                                break;
                
                        /* 发送ZIGBEE信息请求*/
                        case O_MCMMAIN_ZIGBEE_REQ:
                                send_zigbee_message_req(buf);
                                break;

                        /* 报警器控制*/
                        case O_MCMMAIN_BEEP_REQ:
                                beep_control_req(buf);
                                break;

                        /* LED控制*/
                        case O_MCMMAIN_LED_REQ:
                                led_control_req(buf);
                                break;

                        /* 硬件自检*/
                        case O_MCMMAIN_HARDWARE_SELFTEST_REQ:
                                hardware_selftest_req(buf);
                                break;
                
                        /* 时间校准*/
                        case O_MCMMAIN_TOD_ADJUST_REQ:
                                time_adjust_req(buf);
                                break;

                        /* TODO: 查询软件版本*/
                        case O_MCMMAIN_VERSION_QUERY_REQ:
                                /* TODO:*/
                                break;
                } //end switch

        }//end for(;;)
} //end

 好用的PHP版本

count = 1;
//三次握手之后

$file = "";
$_read=array();

$tcp_worker::$stdoutFile = 'echodata.log';

$tcp_worker->onWorkerStart = function()
{
	
	global $file;
	$file = fopen( "/dev/ttyS1", "r+" );	
	if( $file == false )
	{
		echo ( "Error in opening new file" );
	}
	else 
	{
		fwrite($file, "This is  a simple test");
		stream_set_blocking($file,false);
		stream_set_read_buffer($file, 0);
		//chmod("/dev/ttyS1",0777);
			
		Worker::$globalEvent->add($file, EventInterface::EV_READ, function($file)
		{
			$time_t = date("Y/m/d H:i:s");
			$buffer = fread($file,1024);
			if ($buffer === '' || $buffer === false) 
			{
				echo("read error\r\n");	
			}
			else
			{
				echo ($time_t."\r\n".$buffer);
				fwrite($file, $time_t."\r\n".$buffer);
			}
			
			//$connection->send($time_t.$buffer);		
		});				
	}
	
/*  	Timer::add(2, function()use($_read)
	{
		
		$time_t = date("Y/m/d H:i:s");
		echo($time_t."come\r\n");
		$write = $except = null;
		stream_select($_read,$write,$except,1);
		foreach($_read as $fd)
		{
			$buffer = fread($fd,65535);
			if ($buffer === '' || $buffer === false) 
			{
				echo("read error\r\n");
				continue;
			}
			//$connection->send($time_t.$buffer);
			
			echo ($time_t.$buffer);
		}
	});	  */
};

$tcp_worker->onConnect = function($connection)
{
    $time_t = date("Y/m/d H:i:s");
	echo $time_t.":new connection from ip " . $connection->getRemoteIp() . "\n";
	$connection->send('hello world');
	
};
// 当客户端发来数据时
$tcp_worker->onMessage = function($connection, $message)
{
	$time_t = date("Y/m/d H:i:s :");
	//$connection->send($time_t.$message);
	//$connection->close();	
	echo ($time_t.$message."\r\n");
	global $file;
	if( $file == false )
	{
		echo ( "Error in opening new file" );
	}
	else
	{
		fwrite($file, $message);
	} 	  	   
};
$tcp_worker->onClose = function($connection)
{
   $time_t = date("Y/m/d H:i:s");
   echo  $time_t.":".$connection->getRemoteIp().":".$connection->getRemotePort()." closed\n";

};
// 运行worker
Worker::runAll();








看起来多简洁,windows版本,1024个句柄,linux大得很。io复用可以达到极致。目前未解决的问题,串口接收数据必须要有结束符,然后接收到的数据会发送出去。

目前已经解决 ,system("stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 cs8 -echo cbreak");

-echo 关闭回显,cbreak立即响应。

注:平时read时,要回车结束输入,而当开启输入立即响应模式时,输入之后立即响应

linux 平台nano pi H3 M1;

linux IO复用,可检测一切文件描述符(字符设备,块设备,串口)php版本,随意加网页_第1张图片

你可能感兴趣的:(linux,php,运维)