標籤:c int a com 檔案 set
listen(等待串連)
相關函數 socket,bind,accept,connect
表標頭檔 #include<sys/socket.h>
定義函數 int listen(int s,int backlog);
函數說明 listen()用來等待參數s 的socket連線。參數backlog指定同時能處
理的最大串連要求,如果串連數目達此上限則client端將收到
ECONNREFUSED的錯誤。Listen()並未開始接收連線,只是設定
socket為listen模式,真正接收client端連線的是accept()。通常
listen()會在socket(),bind()之後調用,接著才調用accept()。
傳回值 成功則返回0,失敗返回-1,錯誤原因存於errno
附加說明 listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog 最大值可設至128。
錯誤碼 EBADF 參數sockfd非合法socket處理代碼
EACCESS 許可權不足
EOPNOTSUPP 指定的socket並未支援listen模式。
================================================================================
範例:
#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #define PORT 1234 #define MAXSOCKFD 10 main() { int sockfd,newsockfd,is_connected[MAXSOCKFD],fd; struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); fd_set readfds; char buffer[256]; char msg[ ] =”Welcome to server!”; if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){ perror(“socket”); exit(1); } bzero(&addr,sizeof(addr)); addr.sin_family =AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,&addr,sizeof(addr))<0){ perror(“connect”); exit(1); } if(listen(sockfd,3)<0){ perror(“listen”); exit(1); } for(fd=0;fd<MAXSOCKFD;fd++) is_connected[fd]=0; while(1){ FD_ZERO(&readfds); FD_SET(sockfd,&readfds); for(fd=0;fd<MAXSOCKFD;fd++) if(is_connected[fd]) FD_SET(fd,&readfds); if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue; for(fd=0;fd<MAXSOCKFD;fd++) if(FD_ISSET(fd,&readfds)){ if(sockfd = =fd){ if((newsockfd = accept (sockfd,&addr,&addr_len))<0) perror(“accept”); write(newsockfd,msg,sizeof(msg)); is_connected[newsockfd] =1; printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr)); }else{ bzero(buffer,sizeof(buffer)); if(read(fd,buffer,sizeof(buffer))<=0){ printf(“connect closed.\n”); is_connected[fd]=0; close(fd); }else printf(“%s”,buffer); } } } } 執行 $ ./listen connect from 127.0.0.1 hi I am client connected closed.