?? 14.htm
字號:
<DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>char * inet_ntoa(struct in_addr in);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>inet_ntoa()用來將參數in所指的網絡二進制的數字轉換成網絡地址,然后將指向此網絡地址字符串的指針返回。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>成功則返回字符串指針,失敗則返回NULL。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc274></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2><BR>listen(等待連接) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>socket,bind,accept,connect<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<sys/socket.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>int listen(int s,int backlog);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>listen()用來等待參數s 的socket連線。參數backlog指定同時能處理的最大連接要求,如果連接數目達此上限則client端將收到ECONNREFUSED的錯誤。Listen()并未開始接收連線,只是設置socket為listen模式,真正接收client端連線的是accept()。通常listen()會在socket(),bind()之后調用,接著才調用accept()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>成功則返回0,失敗返回-1,錯誤原因存于errno<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>附加說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>listen()只適用SOCK_STREAM或SOCK_SEQPACKET的socket類型。如果socket為AF_INET則參數backlog 最大值可設至128。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>EBADF 參數sockfd非合法socket處理代碼<BR>EACCESS 權限不足<BR>EOPNOTSUPP 指定的socket并未支援listen模式。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<sys/types.h><BR>#include<sys/socket.h><BR>#include<netinet/in.h><BR>#include<arpa/inet.h><BR>#include<unistd.h><BR>#define PORT 1234<BR>#define MAXSOCKFD 10<BR>main()<BR>{<BR>int sockfd,newsockfd,is_connected[MAXSOCKFD],fd;<BR>struct sockaddr_in addr;<BR>int addr_len = sizeof(struct sockaddr_in);<BR>fd_set readfds;<BR>char buffer[256];<BR>char msg[ ] =”Welcome to server!”;<BR>if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){<BR>perror(“socket”);<BR>exit(1);<BR>}<BR>bzero(&addr,sizeof(addr));<BR>addr.sin_family =AF_INET;<BR>addr.sin_port = htons(PORT);<BR>addr.sin_addr.s_addr = htonl(INADDR_ANY);<BR>if(bind(sockfd,&addr,sizeof(addr))<0){<BR>perror(“connect”);<BR>exit(1);<BR>}<BR>if(listen(sockfd,3)<0){<BR>perror(“listen”);<BR>exit(1);<BR>}<BR>for(fd=0;fd<MAXSOCKFD;fd++)<BR>is_connected[fd]=0;<BR>while(1){<BR>FD_ZERO(&readfds);<BR>FD_SET(sockfd,&readfds);<BR>for(fd=0;fd<MAXSOCKFD;fd++)<BR>if(is_connected[fd]) FD_SET(fd,&readfds);<BR>if(!select(MAXSOCKFD,&readfds,NULL,NULL,NULL))continue;<BR>for(fd=0;fd<MAXSOCKFD;fd++)<BR>if(FD_ISSET(fd,&readfds)){<BR>if(sockfd = =fd){<BR>if((newsockfd = accept (sockfd,&addr,&addr_len))<0)<BR>perror(“accept”);<BR>write(newsockfd,msg,sizeof(msg));<BR>is_connected[newsockfd] =1;<BR>printf(“cnnect from %s\n”,inet_ntoa(addr.sin_addr));<BR>}else{<BR>bzero(buffer,sizeof(buffer));<BR>if(read(fd,buffer,sizeof(buffer))<=0){<BR>printf(“connect closed.\n”);<BR>is_connected[fd]=0;<BR>close(fd);<BR>}else<BR>printf(“%s”,buffer);<BR>}<BR>}<BR>}<BR>}<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>執行 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>$ ./listen<BR>connect from 127.0.0.1<BR>hi I am client<BR>connected closed.<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc275></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2><BR>ntohl(將32位網絡字符順序轉換成主機字符順序) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>htonl,htons,ntohs<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<netinet/in.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>unsigned long int ntohl(unsigned long int netlong);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>ntohl()用來將參數指定的32位netlong轉換成主機字符順序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>返回對應的主機字符順序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>參考getservent()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc276></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2><BR>ntohs(將16位網絡字符順序轉換成主機字符順序) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>htonl,htons,ntohl<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<netinet/in.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>unsigned short int ntohs(unsigned short int netshort);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>ntohs()用來將參數指定的16位netshort轉換成主機字符順序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>返回值 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>返回對應的主機順序。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>參考getservent()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc277></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2><BR>recv(經socket接收數據) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>recvfrom,recvmsg,send,sendto,socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<sys/types.h><BR>#include<sys/socket.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>int recv(int s,void *buf,int len,unsigned int flags);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>recv()用來接收遠端主機經指定的socket傳來的數據,并把數據存到由參數buf 指向的內存空間,參數len為可接收數據的最大長度。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>參數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>flags一般設0。其他數值定義如下:<BR>MSG_OOB 接收以out-of-band 送出的數據。<BR>MSG_PEEK 返回來的數據并不會在系統內刪除,如果再調用recv()會返回相同的數據內容。<BR>MSG_WAITALL強迫接收到len大小的數據后才能返回,除非有錯誤或信號產生。<BR>MSG_NOSIGNAL此操作不愿被SIGPIPE信號中斷返回值成功則返回接收到的字符數,失敗返回-1,錯誤原因存于errno中。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>錯誤代碼 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>EBADF 參數s非合法的socket處理代碼<BR>EFAULT 參數中有一指針指向無法存取的內存空間<BR>ENOTSOCK 參數s為一文件描述詞,非socket。<BR>EINTR 被信號所中斷<BR>EAGAIN 此動作會令進程阻斷,但參數s的socket為不可阻斷<BR>ENOBUFS 系統的緩沖內存不足。<BR>ENOMEM 核心內存不足<BR>EINVAL 傳給系統調用的參數不正確。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>范例 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>參考listen()。<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><BR><FONT face=宋體 size=2><A name=linuxc278></A></FONT></DIV></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2><BR></FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2><BR>recvfrom(經socket接收數據) </FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>相關函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>recv,recvmsg,send,sendto,socket<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>表頭文件 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>#include<sys/types.h><BR>#include<sys/socket.h><BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>定義函數 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>int recvfrom(int s,void *buf,int len,unsigned int flags ,struct sockaddr *from ,int *fromlen);<BR></FONT></TD></TR> <TR> <TD vAlign=top width=80> <DIV align=right><FONT face=宋體 size=2>函數說明 </FONT></DIV></TD> <TD vAlign=top><FONT face=宋體 size=2>recv()用來接收遠程主機經指定的socket 傳來的數據,并把數據存到由參數buf 指向的內存空間,參數len 為可接收數據的最大長度。參數flags 一般設0,其他數值定義請參考recv()。參數from用來指定欲傳送的網絡地址,結構sockaddr 請參考bind()。參數fromlen為sockaddr的結構長度。<BR></FONT></TD></TR>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -