亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? porttcp.c

?? 一個開源的Modbus協議棧
?? C
字號:
/*
 * FreeModbus Libary: Win32 Port
 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * File: $Id: porttcp.c,v 1.1 2007/09/12 10:15:56 wolti Exp $
 */

/*
 * Design Notes:
 *
 * The xMBPortTCPInit function allocates a socket and binds the socket to
 * all available interfaces ( bind with INADDR_ANY ). In addition it
 * creates an array of event objects which is used to check the state of
 * the clients. On event object is used to handle new connections or
 * closed ones. The other objects are used on a per client basis for
 * processing.
 */

 /**********************************************************
 *	Linux TCP support.
 *	Based on Walter's project. 
 *	Modified by Steven Guo <gotop167@163.com>
 ***********************************************************/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>

#include "port.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"



/* ----------------------- MBAP Header --------------------------------------*/
#define MB_TCP_UID          6
#define MB_TCP_LEN          4
#define MB_TCP_FUNC         7

/* ----------------------- Defines  -----------------------------------------*/
#define MB_TCP_DEFAULT_PORT 502 /* TCP listening port. */
#define MB_TCP_POOL_TIMEOUT 50  /* pool timeout for event waiting. */
#define MB_TCP_READ_TIMEOUT 1000        /* Maximum timeout to wait for packets. */
#define MB_TCP_READ_CYCLE   100 /* Time between checking for new data. */

#define MB_TCP_DEBUG        1   /* Set to 1 for additional debug output. */

#define MB_TCP_BUF_SIZE     ( 256 + 7 ) /* Must hold a complete Modbus TCP frame. */

#define EV_CONNECTION       0
#define EV_CLIENT           1
#define EV_NEVENTS          EV_CLIENT + 1

/* ----------------------- Static variables ---------------------------------*/
SOCKET          xListenSocket;
SOCKET          xClientSocket = INVALID_SOCKET;
static fd_set   allset;

static UCHAR    aucTCPBuf[MB_TCP_BUF_SIZE];
static USHORT   usTCPBufPos;
static USHORT   usTCPFrameBytesLeft;

/* ----------------------- External functions -------------------------------*/
CHAR           *WsaError2String( int dwError );

/* ----------------------- Static functions ---------------------------------*/
BOOL            prvMBTCPPortAddressToString( SOCKET xSocket, CHAR * szAddr, USHORT usBufSize );
CHAR           *prvMBTCPPortFrameToString( UCHAR * pucFrame, USHORT usFrameLen );
static BOOL     prvbMBPortAcceptClient( void );
static void     prvvMBPortReleaseClient( void );


/* ----------------------- Begin implementation -----------------------------*/

BOOL
xMBTCPPortInit( USHORT usTCPPort )
{
    USHORT          usPort;
    struct sockaddr_in serveraddr;

    if( usTCPPort == 0 )
    {
        usPort = MB_TCP_DEFAULT_PORT;
    }
    else
    {
        usPort = ( USHORT ) usTCPPort;
    }
    memset( &serveraddr, 0, sizeof( serveraddr ) );
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = htonl( INADDR_ANY );
    serveraddr.sin_port = htons( usPort );
    if( ( xListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ) ) == -1 )
    {
        fprintf( stderr, "Create socket failed.\r\n" );
        return FALSE;
    }
    else if( bind( xListenSocket, ( struct sockaddr * )&serveraddr, sizeof( serveraddr ) ) == -1 )
    {
        fprintf( stderr, "Bind socket failed.\r\n" );
        return FALSE;
    }
    else if( listen( xListenSocket, 5 ) == -1 )
    {
        fprintf( stderr, "Listen socket failed.\r\n" );
        return FALSE;
    }
    FD_ZERO( &allset );
    FD_SET( xListenSocket, &allset );
    return TRUE;
}

void
vMBTCPPortClose(  )
{
    // Close all client sockets. 
    if( xClientSocket != SOCKET_ERROR )
    {
        prvvMBPortReleaseClient(  );
    }
    // Close the listener socket.
    if( xListenSocket != SOCKET_ERROR )
    {
        close( xListenSocket );
    }
}

void
vMBTCPPortDisable( void )
{
    /* Close all client sockets. */
    if( xClientSocket != SOCKET_ERROR )
    {
        prvvMBPortReleaseClient(  );
    }
}

/*! \ingroup port_win32tcp
 *
 * \brief Pool the listening socket and currently connected Modbus TCP clients
 *   for new events.
 * \internal
 *
 * This function checks if new clients want to connect or if already connected 
 * clients are sending requests. If a new client is connected and there are 
 * still client slots left (The current implementation supports only one)
 * then the connection is accepted and an event object for the new client
 * socket is activated (See prvbMBPortAcceptClient() ).
 * Events for already existing clients in \c FD_READ and \c FD_CLOSE. In case of
 * an \c FD_CLOSE the client connection is released (See prvvMBPortReleaseClient() ).
 * In case of an \c FD_READ command the existing data is read from the client
 * and if a complete frame has been received the Modbus Stack is notified.
 *
 * \return FALSE in case of an internal I/O error. For example if the internal
 *   event objects are in an invalid state. Note that this does not include any 
 *   client errors. In all other cases returns TRUE.
 */
BOOL
xMBPortTCPPool( void )
{
    int             n;
    fd_set          fread;
    struct timeval  tval;

    tval.tv_sec = 0;
    tval.tv_usec = 5000;
    int             ret;
    USHORT          usLength;

    if( xClientSocket == INVALID_SOCKET )
    {
        /* Accept to client */
        if( ( n = select( xListenSocket + 1, &allset, NULL, NULL, NULL ) ) < 0 )
        {
            if( errno == EINTR )
            {
                ;
            }
            else
            {
                ;
            }
        }
        if( FD_ISSET( xListenSocket, &allset ) )
        {
            ( void )prvbMBPortAcceptClient(  );
        }
    }
    while( TRUE )
    {
        FD_ZERO( &fread );
        FD_SET( xClientSocket, &fread );
        if( ( ( ret = select( xClientSocket + 1, &fread, NULL, NULL, &tval ) ) == SOCKET_ERROR )
            || !ret )
        {
            continue;
        }
        if( ret > 0 )
        {
            if( FD_ISSET( xClientSocket, &fread ) )
            {
                if( ( ( ret =
                        recv( xClientSocket, &aucTCPBuf[usTCPBufPos], usTCPFrameBytesLeft,
                              0 ) ) == SOCKET_ERROR ) || ( !ret ) )
                {
                    close( xClientSocket );
                    xClientSocket = INVALID_SOCKET;
                    return TRUE;
                }
                usTCPBufPos += ret;
                usTCPFrameBytesLeft -= ret;
                if( usTCPBufPos >= MB_TCP_FUNC )
                {
                    /* Length is a byte count of Modbus PDU (function code + data) and the
                     * unit identifier. */
                    usLength = aucTCPBuf[MB_TCP_LEN] << 8U;
                    usLength |= aucTCPBuf[MB_TCP_LEN + 1];

                    /* Is the frame already complete. */
                    if( usTCPBufPos < ( MB_TCP_UID + usLength ) )
                    {
                        usTCPFrameBytesLeft = usLength + MB_TCP_UID - usTCPBufPos;
                    }
                    /* The frame is complete. */
                    else if( usTCPBufPos == ( MB_TCP_UID + usLength ) )
                    {
                        ( void )xMBPortEventPost( EV_FRAME_RECEIVED );
                        return TRUE;
                    }
                    /* This can not happend because we always calculate the number of bytes
                     * to receive. */
                    else
                    {
                        assert( usTCPBufPos <= ( MB_TCP_UID + usLength ) );
                    }
                }
            }
        }
    }
    return TRUE;
}

/*!
 * \ingroup port_win32tcp
 * \brief Receives parts of a Modbus TCP frame and if complete notifies
 *    the protocol stack.
 * \internal 
 *
 * This function reads a complete Modbus TCP frame from the protocol stack.
 * It starts by reading the header with an initial request size for
 * usTCPFrameBytesLeft = MB_TCP_FUNC. If the header is complete the 
 * number of bytes left can be calculated from it (See Length in MBAP header).
 * Further read calls are issued until the frame is complete.
 *
 * \return \c TRUE if part of a Modbus TCP frame could be processed. In case
 *   of a communication error the function returns \c FALSE.
 */

BOOL
xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength )
{
    *ppucMBTCPFrame = &aucTCPBuf[0];
    *usTCPLength = usTCPBufPos;

    /* Reset the buffer. */
    usTCPBufPos = 0;
    usTCPFrameBytesLeft = MB_TCP_FUNC;
    return TRUE;
}

BOOL
xMBTCPPortSendResponse( const UCHAR * pucMBTCPFrame, USHORT usTCPLength )
{
    BOOL            bFrameSent = FALSE;
    BOOL            bAbort = FALSE;
    int             res;
    int             iBytesSent = 0;
    int             iTimeOut = MB_TCP_READ_TIMEOUT;

    do
    {
        res = send( xClientSocket, &pucMBTCPFrame[iBytesSent], usTCPLength - iBytesSent, 0 );
        switch ( res )
        {
        case -1:
            if( iTimeOut > 0 )
            {
                iTimeOut -= MB_TCP_READ_CYCLE;
                usleep( MB_TCP_READ_CYCLE );
            }
            else
            {
                bAbort = TRUE;
            }
            break;
        case 0:
            prvvMBPortReleaseClient(  );
            bAbort = TRUE;
            break;
        default:
            iBytesSent += res;
            break;
        }
    }
    while( ( iBytesSent != usTCPLength ) && !bAbort );

    bFrameSent = iBytesSent == usTCPLength ? TRUE : FALSE;

    return bFrameSent;
}

void
prvvMBPortReleaseClient(  )
{
    ( void )recv( xClientSocket, &aucTCPBuf[0], MB_TCP_BUF_SIZE, 0 );

    ( void )close( xClientSocket );
    xClientSocket = INVALID_SOCKET;
}

BOOL
prvbMBPortAcceptClient(  )
{
    SOCKET          xNewSocket;
    BOOL            bOkay;

    /* Check if we can handle a new connection. */

    if( xClientSocket != INVALID_SOCKET )
    {
        fprintf( stderr, "can't accept new client. all connections in use.\n" );
        bOkay = FALSE;
    }
    else if( ( xNewSocket = accept( xListenSocket, NULL, NULL ) ) == INVALID_SOCKET )
    {
        bOkay = FALSE;
    }
    else
    {
        xClientSocket = xNewSocket;
        usTCPBufPos = 0;
        usTCPFrameBytesLeft = MB_TCP_FUNC;
        bOkay = TRUE;
    }
    return bOkay;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜亚洲精品不卡| 亚洲欧美日韩精品久久久久| 国产一区91精品张津瑜| 亚洲精品一卡二卡| 26uuu亚洲综合色欧美| 91麻豆国产精品久久| 麻豆国产91在线播放| 色婷婷综合五月| 亚洲精品国产a| 色综合色狠狠天天综合色| 国产最新精品免费| 性欧美疯狂xxxxbbbb| 国产精品国产自产拍高清av| 日韩精品自拍偷拍| 欧美做爰猛烈大尺度电影无法无天| 六月婷婷色综合| 亚洲国产中文字幕| 成人欧美一区二区三区小说 | 天堂久久一区二区三区| 日本一区二区三区四区| 欧美三级韩国三级日本一级| 国产成人精品免费在线| 青青草原综合久久大伊人精品 | 蜜桃av一区二区三区| 日韩毛片一二三区| 久久九九久精品国产免费直播| 91亚洲精品一区二区乱码| 麻豆精品在线观看| 亚洲一区在线电影| 欧美激情一区二区三区全黄| 久久综合999| 欧美三级资源在线| 97久久精品人人做人人爽| 亚洲国产日韩a在线播放| 国产欧美一区二区精品忘忧草| 欧美mv和日韩mv国产网站| 欧美一区二区三区四区在线观看 | 一区二区在线观看不卡| 中文字幕一区二区视频| 国产精品视频第一区| 国产精品麻豆网站| 亚洲视频 欧洲视频| 亚洲精品国产一区二区精华液| 亚洲视频精选在线| 国产无人区一区二区三区| 国产精品美日韩| 亚洲一区二区三区小说| 日韩国产精品久久久| 久久99深爱久久99精品| 国产毛片精品视频| 成人动漫一区二区| 国产三级欧美三级| 国产欧美日韩精品一区| 美女视频网站久久| 欧美日本视频在线| 亚洲欧美乱综合| av在线不卡网| 国产日韩av一区二区| 蜜臀va亚洲va欧美va天堂| 欧美色男人天堂| 亚洲欧美激情一区二区| 日韩精品电影在线观看| av激情综合网| 国产suv精品一区二区6| 91毛片在线观看| 精品久久久久久亚洲综合网| 亚洲天堂精品在线观看| 亚洲精品乱码久久久久久黑人 | 欧美日韩情趣电影| 久久日韩粉嫩一区二区三区| 免费观看日韩电影| 94色蜜桃网一区二区三区| 韩国欧美一区二区| 精品乱人伦小说| 一区二区三区日韩欧美| 欧美吻胸吃奶大尺度电影| 精品国产一区二区亚洲人成毛片| 欧美精品一区二区精品网| 一区二区三区小说| 国产大片一区二区| 国产欧美一区二区精品仙草咪| 亚洲国产日韩a在线播放性色| 日本久久精品电影| 国产精品美女久久久久aⅴ国产馆| 亚洲va天堂va国产va久| 日韩视频一区二区三区在线播放 | 成人在线视频首页| 欧美一区在线视频| 亚洲日本韩国一区| 色八戒一区二区三区| 国产三级精品三级在线专区| 国产精品一区二区在线看| 欧美精品一级二级三级| 777午夜精品免费视频| 久久成人羞羞网站| 欧美影院精品一区| 欧美日韩亚洲综合一区二区三区 | 性做久久久久久免费观看| 韩国av一区二区三区在线观看| 国产日韩欧美亚洲| 国产成人午夜高潮毛片| 一区二区三区**美女毛片| 成人app网站| 日韩欧美成人一区二区| 久久99精品久久只有精品| 91精品国产品国语在线不卡| 国产99精品国产| 国产日产欧产精品推荐色| 国产人伦精品一区二区| 欧美性色黄大片| 日韩二区三区四区| 国产精品剧情在线亚洲| 东方aⅴ免费观看久久av| 91精品福利在线一区二区三区| 国产成a人亚洲精品| 国产精品不卡视频| 欧美成人一级视频| 国产伦精品一区二区三区在线观看| 91麻豆国产精品久久| 亚洲高清免费观看高清完整版在线观看 | 国产真实乱偷精品视频免| 欧美精品一区二区三区在线播放| 色女孩综合影院| 日本欧美一区二区三区乱码 | 国产精品一级二级三级| 国产三级一区二区三区| 欧美伦理视频网站| 九色综合国产一区二区三区| 一区二区三区.www| 欧美成人免费网站| 国产精品久久久久桃色tv| 91.xcao| 精品无人区卡一卡二卡三乱码免费卡| 亚洲免费在线播放| 欧美丝袜丝交足nylons图片| 国产精品亚洲视频| 亚洲三级在线观看| 欧美色电影在线| 91小视频免费观看| 日日噜噜夜夜狠狠视频欧美人 | 99视频在线观看一区三区| 日韩激情中文字幕| 久久精品人人做人人综合| 7777精品伊人久久久大香线蕉| 久久国产精品色| 亚洲成人在线网站| 国产丝袜欧美中文另类| 91精品国产高清一区二区三区蜜臀 | 欧美大片国产精品| 成人丝袜18视频在线观看| 久久精品夜夜夜夜久久| 91九色最新地址| 亚洲卡通欧美制服中文| 久久久天堂av| 欧美日本一区二区| 97se狠狠狠综合亚洲狠狠| 久久亚洲综合色| 欧美剧情片在线观看| 日韩和欧美的一区| 中文字幕亚洲视频| 中文字幕亚洲区| 国产午夜久久久久| 精品久久国产老人久久综合| 欧美日韩国产一二三| 丝袜美腿亚洲一区二区图片| 一区二区三区免费在线观看| 久久久久国产精品麻豆ai换脸| 精品福利在线导航| 欧美一级日韩一级| 久久精品一区二区三区不卡牛牛| 欧美性大战久久久| 欧美一级在线免费| 欧美日韩一区二区三区免费看| 久久99国产精品久久| 日韩1区2区3区| 亚洲欧洲精品一区二区精品久久久 | 美国三级日本三级久久99| 韩国av一区二区| 日韩综合小视频| 国产成人在线电影| 蜜桃视频第一区免费观看| 激情综合色播五月| 免费看日韩精品| 亚洲欧美另类久久久精品| 最新日韩在线视频| 亚洲欧洲在线观看av| 香蕉影视欧美成人| 亚洲成在人线在线播放| 国产精品一区二区黑丝| 狠狠色丁香婷婷综合| 在线欧美日韩国产| 91精彩视频在线观看| 欧美电影免费观看高清完整版在线观看| 6080国产精品一区二区| 色婷婷av一区二区三区软件 | 久久久亚洲欧洲日产国码αv| 日韩精品一区二区三区四区| 亚洲欧美日韩一区二区| 亚洲一区二区3| 成人福利视频网站|