⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14.htm

📁 Linux系统函数用法的详细介绍
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><!-- saved from url=(0056)http://linux.tcpip.com.cn/~foolox/c_fun/function/14.html --><HTML><HEAD><TITLE>Untitled Document</TITLE><META http-equiv=Content-Type content="text/html; charset=gb2312"><META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD><BODY><TABLE width="100%">  <TBODY>  <TR>    <TD vAlign=top width=80>        <DIV align=right><BR><FONT face=宋体 size=2><A       name=linuxc263></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>accept(接受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>socket,bind,listen,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&lt;sys/types.h&gt;<BR>#include&lt;sys/socket.h&gt;<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 accept(int s,struct sockaddr *       addr,int * addrlen);<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>accept()用来接受参数s的socket连线。参数s的socket必需先经bind()、listen()函数处理过,当有连线进来时accept()会返回一个新的socket处理代码,往后的数据传送与读取就是经由新的socket处理,而原来参数s的socket能继续使用accept()来接受新的连线要求。连线成功时,参数addr所指的结构会被系统填入远程主机的地址数据,参数addrlen为scokaddr的结构长度。关于结构sockaddr的定义请参考bind()。<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>成功则返回新的socket处理代码,失败返回-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       参数addr指针指向无法存取的内存空间。<BR>ENOTSOCK 参数s为一文件描述词,非socket。<BR>EOPNOTSUPP       指定的socket并非SOCK_STREAM。<BR>EPERM 防火墙拒绝此连线。<BR>ENOBUFS 系统的缓冲内存不足。<BR>ENOMEM       核心内存不足。<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=linuxc264></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>bind(对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>socket,accept,connect,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&lt;sys/types.h&gt;<BR>#include&lt;sys/socket.h&gt;<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 bind(int sockfd,struct sockaddr *       my_addr,int addrlen);<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>bind()用来设置给参数sockfd的socket一个名称。此名称由参数my_addr指向一sockaddr结构,对于不同的socket       domain定义了一个通用的数据结构<BR>struct sockaddr<BR>{<BR>unsigned short int       sa_family;<BR>char sa_data[14];<BR>};<BR>sa_family       为调用socket()时的domain参数,即AF_xxxx值。<BR>sa_data       最多使用14个字符长度。<BR>此sockaddr结构会因使用不同的socket domain而有不同结构定义,例如使用AF_INET       domain,其socketaddr结构定义便为<BR>struct socketaddr_in<BR>{<BR>unsigned short       int sin_family;<BR>uint16_t sin_port;<BR>struct in_addr       sin_addr;<BR>unsigned char sin_zero[8];<BR>};<BR>struct       in_addr<BR>{<BR>uint32_t s_addr;<BR>};<BR>sin_family       即为sa_family<BR>sin_port 为使用的port编号<BR>sin_addr.s_addr 为IP 地址<BR>sin_zero       未使用。<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>addrlen为sockaddr的结构长度。<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>EBADF 参数sockfd       非合法socket处理代码。<BR>EACCESS 权限不足<BR>ENOTSOCK       参数sockfd为一文件描述词,非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>参考listen()<BR></FONT></TD></TR>  <TR>    <TD vAlign=top width=80>        <DIV align=right><BR><FONT face=宋体 size=2><A       name=linuxc265></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>connect(建立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>socket,bind,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&lt;sys/types.h&gt;<BR>#include&lt;sys/socket.h&gt;<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 connect (int sockfd,struct       sockaddr * serv_addr,int addrlen);<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>connect()用来将参数sockfd 的socket       连至参数serv_addr       指定的网络地址。结构sockaddr请参考bind()。参数addrlen为sockaddr的结构长度。<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>EBADF 参数sockfd 非合法socket处理代码<BR>EFAULT       参数serv_addr指针指向无法存取的内存空间<BR>ENOTSOCK 参数sockfd为一文件描述词,非socket。<BR>EISCONN       参数sockfd的socket已是连线状态<BR>ECONNREFUSED 连线要求被server端拒绝。<BR>ETIMEDOUT       企图连线的操作超过限定时间仍未有响应。<BR>ENETUNREACH 无法传送数据包至指定的主机。<BR>EAFNOSUPPORT       sockaddr结构的sa_family不正确。<BR>EALREADY   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>/* 利用socket的TCP client<BR>此程序会连线TCP       server,并将键盘输入的字符串传送给server。<BR>TCP       server范例请参考listen()。<BR>*/<BR>#include&lt;sys/stat.h&gt;<BR>#include&lt;fcntl.h&gt;<BR>#include&lt;unistd.h&gt;<BR>#include&lt;sys/types.h&gt;<BR>#include&lt;sys/socket.h&gt;<BR>#include&lt;netinet/in.h&gt;<BR>#include&lt;arpa/inet.h&gt;<BR>#define       PORT 1234<BR>#define SERVER_IP “127.0.0.1”<BR>main()<BR>{<BR>int       s;<BR>struct sockaddr_in addr;<BR>char buffer[256];<BR>if((s =       socket(AF_INET,SOCK_STREAM,0))&lt;0){<BR>perror(“socket”);<BR>exit(1);<BR>}<BR>/*       填写sockaddr_in结构*/<BR>bzero(&amp;addr,sizeof(addr));<BR>addr.sin_family =       AF_INET;<BR>addr.sin_port=htons(PORT);<BR>addr.sin_addr.s_addr =       inet_addr(SERVER_IP);<BR>/*       尝试连线*/<BR>if(connect(s,&amp;addr,sizeof(addr))&lt;0){<BR>perror(“connect”);<BR>exit(1);<BR>}<BR>/*       接收由server端传来的信息*/<BR>recv(s,buffer,sizeof(buffer),0);<BR>printf(“%s\n”,buffer);<BR>while(1){<BR>bzero(buffer,sizeof(buffer));<BR>/*       从标准输入设备取得字符串*/<BR>read(STDIN_FILENO,buffer,sizeof(buffer));<BR>/*       将字符串传给server端*/<BR>if(send(s,buffer,sizeof(buffer),0)&lt;0){<BR>perror(“send”);<BR>exit(1);<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>$ ./connect<BR>Welcome to       server!<BR>hi I am client!   /*键盘输入*/<BR>/*&lt;Ctrl+C&gt;中断程序*/<BR></FONT></TD></TR>  <TR>    <TD vAlign=top width=80>        <DIV align=right><BR><FONT face=宋体 size=2><A       name=linuxc266></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>endprotoent(结束网络协议数据的读取)   </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>getprotoent,getprotobyname,getprotobynumber,setprotoent<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&lt;netdb.h&gt;<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>void   endprotoent(void);<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>endprotoent()用来关闭由getprotoent()打开的文件。<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>参考getprotoent()<BR></FONT></TD></TR>  <TR>    <TD vAlign=top width=80>        <DIV align=right><BR><FONT face=宋体 size=2><A       name=linuxc267></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>endservent(结束网络服务数据的读取)   </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,getservbyname,getservbyport,setservent<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&lt;netdb.h&gt;<BR></FONT></TD></TR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -