📄 linux 常用c函数(中文版)-接口处理.htm
字号:
<TD vAlign=top><FONT face=宋体
size=2>#include<sys/socket.h><BR>#include<netinet/in.h><BR>#include<arpa/inet.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>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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -