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

📄 streams.doc7.html

📁 vxworks相关论文
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name="90910" class="autotag">    if(t_connect(xFd, sndCall, NULL) &lt; 0) </a><a name="90911" class="autotag">        {</a><a name="90912" class="autotag">        t_error("t_connect failed for xFd\n");</a><a name="90913" class="autotag">        return;</a><a name="95223" class="autotag">        } </a><a name="95224" class="autotag"></a><a name="95225" class="autotag">    /* The client continuously calls t_rcv to process incoming data, if no</a><a name="90917" class="autotag">     * data is available, t_rcv blocks until data arrives</a><a name="90918" class="autotag">     */ </a><a name="90919" class="autotag"></a><a name="90920" class="autotag">    while (1) </a><a name="90921" class="autotag">        {</a><a name="90922" class="autotag">        if((nBytes = t_rcv(xFd, buf, 1024, &amp;flags)) != ERROR)</a><a name="90923" class="autotag">            {</a><a name="90924" class="autotag">            printf("Server wrote %s\n",buf);</a><a name="90925" class="autotag">            return;</a><a name="90926" class="autotag">            } </a><a name="90927" class="autotag"></a><a name="90928" class="autotag">    /* The client processes the connection release when it receives a </a><a name="90929" class="autotag">     * orderly release indication , it proceeds with the release procedure</a><a name="90930" class="autotag">     * by calling t_rcvrel to process the indication and t_sndrel to</a><a name="90931" class="autotag">     * inform the server that it is ready to release the connection</a><a name="90932" class="autotag">     */ </a><a name="90933" class="autotag"></a><a name="90934" class="autotag">    if((t_errno == TLOOK) &amp;&amp; (t_look(xFd) == T_ORDREL)) </a><a name="90935" class="autotag">        {</a><a name="90936" class="autotag">        if(t_rcvrel(xFd) &lt; 0) </a><a name="90937" class="autotag">            {</a><a name="90938" class="autotag">            t_error("t_rcvrel failed");</a><a name="90939" class="autotag">            return;</a><a name="90940" class="autotag">            } </a><a name="90941" class="autotag">            if(t_sndrel(xFd) &lt; 0) </a><a name="90942" class="autotag">                {</a><a name="90943" class="autotag">                t_error("t_sndrel failed");</a><a name="90944" class="autotag">                return;</a><a name="90945" class="autotag">                } </a><a name="90946" class="autotag">        return;</a><a name="90947" class="autotag">        }</a><a name="90948" class="autotag">        t_error("t_rcv failed");</a><a name="90949" class="autotag">    return;</a><a name="90950" class="autotag">    }</a></pre></dd></dl><font face="Helvetica, sans-serif" size="-1" class="sans"><h5 class="HU"><i><a name="90951" class="autotag">Server Program</a></i></h5></font><dl class="margin"><dd><pre class="Code"><a name="90952" class="autotag">#include<b> "tiuser.h"</b></a><a name="90953" class="autotag"><b>#include "stropts.h"</b></a><a name="90954" class="autotag"><b>#include "fcntl</b>.h"</a><a name="90955" class="autotag">#include "stdio.h"</a><a name="90956" class="autotag">#include "vxWorks.h"</a><a name="90957" class="autotag">#include "taskLib.h"</a><a name="90958" class="autotag"></a><a name="90959" class="autotag">#define DISCONNECT</a><a name="90960" class="autotag">#define SRV_ADDR 1</a><a name="90961" class="autotag"></a><a name="90962" class="autotag">int connFd;</a><a name="90963" class="autotag">extern int t_errno;</a><a name="90964" class="autotag">void runServer1();</a><a name="90965" class="autotag"></a><a name="90966" class="autotag">void xtiServer() </a><a name="90967" class="autotag">    {</a><a name="90968" class="autotag">    int listenFd;                   /* file descriptor server is listening on */</a><a name="90969" class="autotag">    struct t_bind *tBind;           /* port address to be bound by the server */</a><a name="90970" class="autotag">    struct t_bind *retBind;         /* port address actually bound by the server*/</a><a name="90971" class="autotag">    struct t_call *call;            /* Address of the client */ </a><a name="90972" class="autotag"></a><a name="90973" class="autotag">    /* The tliUserInit() call is used to make the TLI variable "t_errno" </a><a name="90974" class="autotag">     * a task variable. This call has to be made before any other XTI/TLI</a><a name="90975" class="autotag">     * services are used</a><a name="90976" class="autotag">     */ </a><a name="90977" class="autotag"></a><a name="90978" class="autotag">    tliUserInit();</a><a name="90979" class="autotag"></a><a name="90980" class="autotag">    /* Server makes a t_open to establish a transport endpoint with the</a><a name="90981" class="autotag">     * /dev/tpit transport provider. This descriptor "listenFd" will be</a><a name="90982" class="autotag">     * used to listen for connect indications. </a><a name="90983" class="autotag">     */ </a><a name="90984" class="autotag"></a><a name="90985" class="autotag">    if((listenFd = t_open("/dev/tpit", O_RDWR, NULL)) &lt;0) </a><a name="90986" class="autotag">        {</a><a name="90987" class="autotag">        t_error("t_open failed for listenFd");</a><a name="90988" class="autotag">        return;</a><a name="90989" class="autotag">        }</a><a name="90990" class="autotag"></a><a name="90991" class="autotag">    if((tBind = (struct t_bind *)t_alloc(listenFd, T_BIND, T_ALL)) == NULL) </a><a name="90992" class="autotag">        {</a><a name="90993" class="autotag">        t_error("t_alloc of t_bind structure failed");</a><a name="90994" class="autotag">        return;</a><a name="90995" class="autotag">        }</a><a name="90996" class="autotag"></a><a name="90997" class="autotag">    tBind-&gt;qlen = 5;</a><a name="90998" class="autotag">    tBind-&gt;addr.len = sizeof(int);</a><a name="90999" class="autotag">    *(int *)tBind-&gt;addr.buf = SRV_ADDR;</a><a name="91000" class="autotag"></a><a name="91001" class="autotag">    /* The server binds its well known address to the transport endpoint */ </a><a name="91002" class="autotag"></a><a name="91003" class="autotag">    if(t_bind(listenFd, tBind, retBind) &lt; 0) </a><a name="91004" class="autotag">        {</a><a name="91005" class="autotag">        t_error("t_bind failed for listenFd");</a><a name="91006" class="autotag">        return;</a><a name="91007" class="autotag">        }</a><a name="91008" class="autotag"></a><a name="91009" class="autotag">    if( *(int *)tBind-&gt;addr.buf != SRV_ADDR) </a><a name="91010" class="autotag">        {</a><a name="91011" class="autotag">        printf("t_bind bound wrong address %d\n", *(int *)retBind-&gt;addr.buf);</a><a name="91012" class="autotag">        return;</a><a name="91013" class="autotag">        }</a><a name="91014" class="autotag"></a><a name="91015" class="autotag">    if((call = (struct t_call *)t_alloc(listenFd, T_CALL, T_ALL)) == NULL) </a><a name="91016" class="autotag">        {</a><a name="91017" class="autotag">        t_error("t_alloc of t_call structure failed");</a><a name="91018" class="autotag">        return;</a><a name="91019" class="autotag">        }</a><a name="91020" class="autotag"></a><a name="91021" class="autotag">    /* The server will loop forever, processing each connect indication</a><a name="91022" class="autotag">     * When one arrives, the server calls accept_call to accept the</a><a name="91023" class="autotag">     * connect request</a><a name="91024" class="autotag">     */</a><a name="91025" class="autotag"></a><a name="91026" class="autotag">    while (1) </a><a name="91027" class="autotag">        {</a><a name="91028" class="autotag">        if(t_listen(listenFd, call) &lt; 0) </a><a name="91029" class="autotag">            {</a><a name="91030" class="autotag">            t_error("t_listen failed for listen");</a><a name="91031" class="autotag">            return</a><a name="91032" class="autotag">            }</a><a name="91033" class="autotag">        if((connFd = acceptCall1(listenFd, call)) != DISCONNECT)</a><a name="91034" class="autotag">            runServer1(listenFd);</a><a name="91035" class="autotag">        } </a><a name="91036" class="autotag">    }</a><a name="91037" class="autotag"></a><a name="91038" class="autotag">void acceptCall1</a><a name="91039" class="autotag">    (</a><a name="91040" class="autotag">    int listenFd,             /* XTI endpoint descriptor server is listening */</a><a name="91041" class="autotag">    struct t_call *call       /* Client's address is returned */</a><a name="91042" class="autotag">    )</a><a name="91043" class="autotag">    {</a><a name="91044" class="autotag">    int resfd;                /* endpoint server accepts the connection */</a><a name="91045" class="autotag"></a><a name="91046" class="autotag">    /* The server establishes another transport endpoint to establish the</a><a name="91047" class="autotag">     * connection. A connection could have been established on the listenFd</a><a name="91048" class="autotag">     * but that would prevent other clients from accessing the server for </a><a name="91049" class="autotag">     * the duration of the connection.</a><a name="91050" class="autotag">     */ </a><a name="91051" class="autotag"></a><a name="91052" class="autotag">    if((resfd = t_open("/dev/tpit", O_RDWR, NULL)) &lt; 0) </a><a name="91053" class="autotag">        {</a><a name="91054" class="autotag">        t_error("t_open for responding fd failed");</a><a name="91055" class="autotag">        return;</a><a name="91056" class="autotag">        } </a><a name="91057" class="autotag"></a><a name="91058" class="autotag">    if(t_bind(resfd,NULL,NULL) &lt; 0) </a><a name="91059" class="autotag">        {</a><a name="91060" class="autotag">        t_error("t_bind for responding fd failed");</a><a name="91061" class="autotag">        return;</a><a name="91062" class="autotag">        } </a><a name="91063" class="autotag"></a><a name="91064" class="autotag">    /* The first two arguments to t_accept listening transport endpoint</a><a name="91065" class="autotag">     * and the endpoint where the connection will be accepted. The third </a><a name="91066" class="autotag">     * argument points to the t_call structure associated with the connect</a><a name="91067" class="autotag">     * indication, This structure contains the address of the calling user</a><a name="91068" class="autotag">     * and the sequence number returned by t_listen</a><a name="91069" class="autotag">     */</a><a name="91070" class="autotag"></a><a name="91071" class="autotag">    if(t_accept(listenFd, resfd, call) &lt; 0) </a><a name="91072" class="autotag">        {</a><a name="91073" class="autotag">        if(t_errno == TLOOK) </a><a name="91074" class="autotag">            {</a><a name="91075" class="autotag"></a><a name="91076" class="autotag">    /* If t_accept fails and a disconnect indication arrives, The server</a><a name="91077" class="autotag">     * retrieves the disconnect indication using t_rcvdis</a><a name="91078" class="autotag">     */</a><a name="91079" class="autotag"></a><a name="91080" class="autotag">        if(t_rcvdis(listenFd,NULL) &lt; 0) </a><a name="91081" class="autotag">            {</a><a name="91082" class="autotag">            t_error("t_rcvdis failed for listenFd");</a><a name="91083" class="autotag">            return;</a><a name="91084" class="autotag">            } </a><a name="91085" class="autotag"></a><a name="91086" class="autotag">    /* The server closes the responding transport endpoint and returns </a><a name="91087" class="autotag">     * DISCONNECT which informs the server that the connection was</a><a name="91088" class="autotag">     * disconnected by the client</a><a name="91089" class="autotag">     */</a><a name="91090" class="autotag"></a><a name="91091" class="autotag">    if(t_close(resfd) &lt; 0) </a><a name="91092" class="autotag">        {</a><a name="91093" class="autotag">        t_error("t_close failed for responding fd");</a><a name="91094" class="autotag">        return;</a><a name="91095" class="autotag">        } </a><a name="91096" class="autotag">    return(DISCONNECT);</a><a name="91097" class="autotag">    } </a><a name="91098" class="autotag">    t_error("t_accept failed");</a><a name="91099" class="autotag">    return;</a><a name="91100" class="autotag">    } </a><a name="91101" class="autotag">    return(resfd);</a><a name="91102" class="autotag">    }</a><a name="91103" class="autotag"></a><a name="91104" class="autotag">void connrelease1( void )</a><a name="91105" class="autotag">    {</a><a name="91106" class="autotag">    if(t_look(connFd) == T_DISCONNECT) </a><a name="91107" class="autotag">        {</a><a name="91108" class="autotag">        printf("connection aborted\n")</a><a name="91109" class="autotag">        return;</a><a name="91110" class="autotag">        } </a><a name="91111" class="autotag">    return;</a><a name="91112" class="autotag">    }</a><a name="91113" class="autotag"></a><a name="91114" class="autotag">void runServer1</a><a name="91115" class="autotag">    (</a><a name="91116" class="autotag">    int listenFd                /* Endpoint where connection is setup */</a><a name="95105" class="autotag">    )</a><a name="91117" class="autotag">    {</a><a name="91118" class="autotag">    char buf[50];               /* Buffer to store data to send to client */</a><a name="91119" class="autotag"></a><a name="91120" class="autotag">    strcpy(buf, "This is SERVER calling to the client");</a><a name="91121" class="autotag"></a><a name="91122" class="autotag">    if(t_close(listenFd) &lt; 0) </a><a name="91123" class="autotag">        {</a><a name="91124" class="autotag">        t_error("t_close failed for listenFd");</a><a name="91125" class="autotag">        return;</a><a name="91126" class="autotag">        } </a><a name="91127" class="autotag"></a><a name="91128" class="autotag">    if(t_look(connFd) != 0) </a><a name="91129" class="autotag">        {</a><a name="91130" class="autotag">        printf("t_look : unexpected error\n");</a><a name="91131" class="autotag">        return;</a><a name="91132" class="autotag">        } </a><a name="91133" class="autotag"></a><a name="91134" class="autotag">    /* The server sends the data to the client using t_snd. The fourth</a><a name="91135" class="autotag">     * argument can contain flags to specify that the data is expedited.</a><a name="91136" class="autotag">     */</a><a name="91137" class="autotag"></a><a name="91138" class="autotag">    while (1) </a><a name="91139" class="autotag">        {</a><a name="91140" class="autotag">        if(t_snd(connFd, buf, sizeof(buf), 0) &lt; 0) </a><a name="91141" class="autotag">            {</a><a name="91142" class="autotag">            t_error("t_snd failed");</a><a name="91143" class="autotag">            return;</a><a name="91144" class="autotag">            } </a><a name="91145" class="autotag">        } </a><a name="91146" class="autotag"></a><a name="91147" class="autotag">    /* The server invokes the t_sndrel to perform the orderly release of </a><a name="91148" class="autotag">     * connection, when all data has been transferred</a><a name="91149" class="autotag">     */</a><a name="91150" class="autotag"></a><a name="91151" class="autotag">    if( t_sndrel(connFd) &lt; 0) </a><a name="91152" class="autotag">        {</a><a name="91153" class="autotag">        t_error("t_sndrel failed");</a><a name="91154" class="autotag">        return;</a><a name="91155" class="autotag">        } </a><a name="91156" class="autotag">    }</a></pre></dd></dl></dd></dl><a name="foot"><hr></a><p class="navbar" align="right"><a href="index.html"><img border="0" alt="[Contents]" src="../../icons/contents.gif"></a><a href="streams.doc6.html"><img border="0" alt="[Prev]" src="../../icons/prev.gif"></a><a href="streams.doc8.html"><img border="0" alt="[Next]" src="../../icons/next.gif"></a></p></body></html><!---This file generated April 10, 1998, 12:25PM PDTby WRS Documentation (jeff), Wind River Systems, Inc.    conversion tool:  Quadralay WebWorks Publisher 3.5.0    template:         CSS Template, Jan 1998 - Jefro --->

⌨️ 快捷键说明

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