📄 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 + -