socket程式設計使用poll替換select

2021-08-28 11:10:43 字數 3082 閱讀 5028

poll函式在處理併發時, 無fd_setsize限制

//伺服器端

#include #include #include #include #include #include //使用signal函式

#include //使用wait函式

#include #include #include #include #include #define err_exit(m) \

do \

while(0)

//讀確定大小的包

//ssize_t有符號數,size_t為無符號數

ssize_t readn(int fd, void *buf, size_t count)

return -1;//否則出錯

} else if(nread==0)//表示對方關閉傳送

bufp+=nread;//進行指標偏移

nleft -= nread;

} return count;

}ssize_t writen(int fd, const void *buf, size_t count)

return -1;//否則出錯

} else if(nwritten==0)

bufp+=nwritten;//進行指標偏移

nleft -= nwritten;

} return count;

}ssize_t recv_peek(int sockfd, void *buf,size_t len)

}ssize_t readline(int sockfd, void *buf, size_t maxline)

else if(ret=0)

nread=ret;

int i;//檢測有沒有『\n』字元,有則讀取

for(i=0; i0)

}int main(void)

else

close(conn);

} */

int i;

int maxi = 0;

struct pollfd client[2048];//假設乙個程序可以開啟最大的檔案描述符數為2048

for(i=0; i<2048; i++)

int nready;

client[0].fd = listenfd;

client[0].events = pollin;//讀可讀事件感興趣

while(1)

if(nready==0)

continue;

if(client[0].revents & pollin)//返回發生的事件與pollin相同

//if(fd_isset(listenfd, &rset))

}if(i==2048)

printf("ip=%s port=%d\n", inet_ntoa(peeraddr.sin_addr), ntohs(peeraddr.sin_port));

//fd_set(conn, &allset);

client[i].events = pollin;//新增事件

if(--nready<=0)

continue;

}//監聽套介面總為client[0]

//已連線套介面從1到maxi

for(i=1; i<=maxi; i++)

;int ret = readline(conn, recvbuf,1024);//先接受包頭

if(ret==-1)//讀取失敗則退出

err_exit("readline");

else if(ret==0)//客戶端關閉

fputs(recvbuf,stdout);//列印標準輸出

writen(conn,recvbuf, strlen(recvbuf));

if(--nready<=0)

break;}}

} return 0;

}#include #include #include #include #include #include #include #include #include #define err_exit(m) \

do \

while(0)

//讀確定大小的包

//ssize_t有符號數,size_t為無符號數

ssize_t readn(int fd, void *buf, size_t count)

return -1;//否則出錯

} else if(nread==0)//表示對方關閉傳送

bufp+=nread;//進行指標偏移

nleft -= nread;

} return count;

}ssize_t writen(int fd, const void *buf, size_t count)

return -1;//否則出錯

} else if(nwritten==0)

bufp+=nwritten;//進行指標偏移

nleft -= nwritten;

} return count;

}ssize_t recv_peek(int sockfd, void *buf,size_t len)

}ssize_t readline(int sockfd, void *buf, size_t maxline)

else if(ret=0)

nread=ret;

int i;

for(i=0; isock)

maxfd =fd_stdin;

else

maxfd = sock;

while(1)

fputs(recvbuf,stdout);//列印標準輸出

//memset(&sendbuf,0, sizeof(sendbuf));//該段只執行接受伺服器資料

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

} if(fd_isset(fd_stdin, &rset))

} close(sock);

}int main(void)

ehco_cli(sock);

return 0;

}

網路程式設計 poll

寫下來,怕忘記了 server include include include include include include include include gettimeofday include struct in addr include inet aton include getpid i...

socket程式設計 select方法使用

0.背景 最近要寫乙個rpc庫,即在客戶端向服務端傳送請求,伺服器計算並返回結果,要求實現服務端能同時接收多個客戶端請求但是不能使用執行緒庫,根據提示我知道了可以使用select函式來完成非阻塞方式工作的程式,於是我就開始了select方法的學習。1.概念 select在socket程式設計中還是比...

網路程式設計 21 poll

三 測試 理解 poll 函式 int poll struct ploofd fds,unsigned long nfds,int timeout 引數 返回值 struct pollfd struct pollfdpollserver.c include common.h intmain int ...