UNIX網路程式設計學習(15)--使用單程式和select的TCP伺服器程式
#include "unp.h"
int
main(int argc, char ** argv)
{
int i,maxi,maxfd,listenfd,connfd,sockfd;
int nready,client[FD_SETSIZE];
ssize_t n;
fd_set rset,allset;
char buf[MAXLINE];
socklen_t clilen;
struct sockaddr_in cliaddr,servaddr;
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);//#define SERV_PORT 9877
Bind(listenfd, (SA *)&servaddr, sizeof(servaddr));
Listen(listenfd, LISTENQ);
maxfd = listenfd;/* initialize */
printf("listenfd=%d\n",maxfd);//listenfd=3
maxi = -1;/* index into client[] array */
for(i = 0;i<FD_SETSIZE;i++)//FD_SETSIZE is 1024
client[i]=-1;/* -1 indicates available entry */
FD_ZERO(&allset);
FD_SET(listenfd,&allset);
for( ; ; )
{
rset = allset;//structure assignment
nready = Select(maxfd+1,&rset,NULL,NULL,NULL);
if(FD_ISSET(listenfd,&rset))/* new client connection */
{
clilen = sizeof(cliaddr);
connfd = Accept(listenfd ,(SA *)&cliaddr,&clilen);
for(i=0;i<FD_SETSIZE;i++)
{
client[i]=connfd;//save descriptor
break;
}
if(i==FD_SETSIZE)
err_quit("too many clients");
FD_SET(connfd,&allset);//add new descriptor to set
if(connfd > maxfd)
maxfd = connfd;/* for select */
if(i > maxi)
maxi = i;/* max index in client[] array */
if(--nready <= 0)
continue;/* no more readable descriptors */
}
for(i=0;i<=maxi;i++)/* check all clients for data */
{
if((sockfd = client[i])<0)
continue;
if(FD_ISSET(sockfd,&rset))
{
if((n = Read(sockfd,buf,MAXLINE)) == 0)/*connection closed by client */
{
Close(sockfd);
FD_CLR(sockfd,&allset);
client[i]=-1;
}
else
Writen(sockfd,buf,n);
if(--nready <= 0)
break;/* no more readable descriptors */
}
}
}
}
相關文章
- UNIX網路程式設計學習(16)--使用poll的TCP伺服器程式程式設計TCP伺服器
- UNIX網路程式設計學習(3)--簡單時間獲取伺服器程式程式設計伺服器
- 《UNIX網路程式設計》筆記 - select和poll程式設計筆記
- 《Unix 網路程式設計》05:TCP C/S 程式示例程式設計TCP
- UNIX網路程式設計學習(13)--使用select的str_cli函式的實現程式設計函式
- 《Unix 網路程式設計》15:Unix 域協議程式設計協議
- Java 網路程式設計(TCP程式設計 和 UDP程式設計)Java程式設計TCPUDP
- UNIX網路程式設計學習(18)--UDP回射(伺服器+客戶端)程式程式設計UDP伺服器客戶端
- python 學習-- TCP程式設計PythonTCP程式設計
- UNIX網路程式設計學習(10)續--處理accept返回EINTR錯誤的TCP伺服器程式最終(正確)版本程式設計TCP伺服器
- UNIX網路程式設計學習(9)--getsockname和getpeername的用法及例項程式設計
- 【LINUX 學習】使用find和xargs[轉摘自《shell程式設計和unix命令》]Linux程式設計
- JAVA網路程式設計(2)TCP程式設計Java程式設計TCP
- 《Unix 網路程式設計》13:守護程式和 inetd 超級伺服器程式設計伺服器
- Linux學習/TCP程式設計學習筆記LinuxTCP程式設計筆記
- UNIX網路程式設計學習(11)--分析TCP回射服務+客戶程式:正常啟動與正常終止程式設計TCP
- Unix哲學(Unix程式設計藝術)程式設計
- Unix程式設計藝術,Unix哲學程式設計
- 好程式設計師大資料學習路線分享TCP和UDP學習筆記程式設計師大資料TCPUDP筆記
- Java Tcp協議socket程式設計學習JavaTCP協議程式設計
- UNIX網路程式設計學習(4)--值-結果引數程式設計
- UNIX網路程式設計學習(14)--使用select正確處理EOF的str_cli函式修訂版程式設計函式
- UNIX網路程式設計學習(8)--伺服器端顯示客戶端的IP地址和埠號程式設計伺服器客戶端
- 【網路程式設計】Tcp/Udp程式設計TCPUDP
- python網路-Socket之TCP程式設計(26)PythonTCP程式設計
- 風變程式設計,讓程式設計學習更簡單!程式設計
- python網路程式設計學習筆記(3):socket網路伺服器Python程式設計筆記伺服器
- UNIX網路程式設計 卷2 原始碼使用程式設計原始碼
- TCP/IP網路程式設計模型TCP程式設計模型
- UNIX網路程式設計 卷2:程式間通訊程式設計
- 《Unix 網路程式設計》11:名字和地址轉換程式設計
- 學會Zynq(11)RAW API的TCP和UDP程式設計APITCPUDP程式設計
- TCP程式設計(七)TCP程式設計
- UINX 網路程式設計學習(2)--簡單的時間獲取客戶程式UI程式設計
- 程式設計師的學習和積累程式設計師
- 網路遊戲程式設計師須知 UDP vs TCP(轉)遊戲程式設計師UDPTCP
- 開啟電腦就能學習,風變程式設計讓學習程式設計更簡單程式設計
- TCP併發伺服器的程式設計實現TCP伺服器程式設計