📄 streams.doc7.html
字号:
<a name="90910" class="autotag"> if(t_connect(xFd, sndCall, NULL) < 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, &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) && (t_look(xFd) == T_ORDREL)) </a><a name="90935" class="autotag"> {</a><a name="90936" class="autotag"> if(t_rcvrel(xFd) < 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) < 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)) <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->qlen = 5;</a><a name="90998" class="autotag"> tBind->addr.len = sizeof(int);</a><a name="90999" class="autotag"> *(int *)tBind->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) < 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->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->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) < 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)) < 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) < 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) < 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) < 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) < 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) < 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) < 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) < 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 + -