网站首页 | 网页制作 | 网络编程 | 图形图象 | 冲浪宝典 | 操作系统 | 软件教学 | 网络安全 | 认证考试 | 下载中心 | 游戏下载
| 操作系统首页|Windowns2003|Windowns2000|WindownsXP|Linux|FreeBSD|Unix|DOS|Solaris|SCO_Unix|HP-Unix|注册表|经验技巧 |
您现在的位置: 超人气学院 >> 操作系统 >> Linux >> 文章正文 用户登录 新用户注册
LinuxC编程---网络编程         
LinuxC编程---网络编程
作者:未知 文章来源:网络收集 点击数: 更新时间:2006-3-23 23:37:24

  作者:小鸟
  
  网络编程,一定离不开套接口;那什么是套接口呢?在Linux下,所有的I/O操作都是通过读写文件描述符而产生的,文件描述符是一个和打开的文件相关联的整数,这个文件并不只包括真正存储在磁盘上的文件,还包括一个网络连接、一个命名管道、一个终端等,而套接口就是系统进程和文件描述符通信的一种方法。目前最常用的套接口是字:字节流套接口(基于TCP)和数据报套接口(基于UDP),当然还有原始套接口(原始套接口提供TCP套接口和UDP套接口所不提供的功能,如构造自己的TCP或UDP分组)等,我们这里主要介绍字节流套接口和数据报套接口。
  
  要学习网络编程,一定离不开网络库的函数,在Linux系统下,可以用"man 函数名"来得到这个函数的帮助,不过为了照顾E文不大好的朋友,下面就将常用的网络函数和用法列出来供大家参考:
  
  1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。
  -------------------------------------------------------------------------------------
  #include                             
  int socket(int family,int type,int protocol);                
              返回:非负描述字---成功   -1---失败
  -------------------------------------------------------------------------------------
  第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREAM(字节流套接口)、SOCK_DGRAM(数据报套接口)和SOCK_RAW(原始套接口);如果套接口类型不是原始套接口,那么第三个参数就为0。
  
  2、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。
  -------------------------------------------------------------------------------------
  #include                             
  int connect(int sockfd,const struct sockaddr * servaddr,socklen_t addrlen);  
                     返回:0---成功   -1---失败
  -------------------------------------------------------------------------------------
  第一个参数是socket函数返回的套接口描述字;第二和第三个参数分别是一个指向套接口地址结构的指针和该结构的大小。
  这些地址结构的名字均已“sockaddr_”开头,并以对应每个协议族的唯一后缀结束。以IPv4套接口地址结构为例,它以“sockaddr_in”命名,定义在头文件;以下是结构体的内容:
  -------------------------------------------------------------------------------------
  struct in_addr {
  in_addr_t s_addr;      /* IPv4地址 */
  };                 
  struct sockaddr_in {
  uint8_t sin_len; /* 无符号的8位整数 */
  sa_family_t sin_family; /* 套接口地址结构的地址簇,这里为AF_INET */
  in_port_t sin_port; /* TCP或UDP端口 */
                    
  struct in_addr sin_addr;
  char sin_zero[8];
  };               
  -------------------------------------------------------------------------------------
  
  3、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。
  -------------------------------------------------------------------------------------
  #include            
  int bind(int sockfd,const struct sockaddr * myaddr,socklen_t addrlen);
  返回:0---成功   -1---失败 
  -------------------------------------------------------------------------------------
  第一个参数是socket函数返回的套接口描述字;第二和第第三个参数分别是一个指向特定于协议的地址结构的指针和该地址结构的长度。
  
  4、listen函数:listen函数仅被TCP服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。
  -------------------------------------------------------------------------------------
  #include       
  int listen(int sockfd,int backlog);   
  返回:0---成功   -1---失败
  -------------------------------------------------------------------------------------
    第一个参数是socket函数返回的套接口描述字;第二个参数规定了内核为此套接口排队的最大连接个数。由于listen函数第二个参数的原因,内核要维护两个队列:以完成连接队列和未完成连接队列。未完成队列中存放的是TCP连接的三路握手为完成的连接,accept函数是从以连接队列中取连接返回给进程;当以连接队列为空时,进程将进入睡眠状态。
  
  5、accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。
  -------------------------------------------------------------------------------------
  #include         
  int accept(int sockfd,struct sockaddr * cliaddr,socklen_t * addrlen);      
     返回:非负描述字---成功   -1---失败
  -------------------------------------------------------------------------------------
  第一个参数是socket函数返回的套接口描述字;第二个和第三个参数分别是一个指向连接方的套接口地址结构和该地址结构的长度;该函数返回的是一个全新的套接口描述字;如果对客户段的信息不感兴趣,可以将第二和第三个参数置为空。
  
  6、inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
  -------------------------------------------------------------------------------------
   #include                          
  int inet_pton(int family,const char * strptr,void * addrptr);         
  返回:1---成功   0---输入不是有效的表达格式   -1---失败
  -------------------------------------------------------------------------------------
  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。
  
  7、inet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
  -------------------------------------------------------------------------------------
  #include  
  const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len);  
              返回:指向结果的指针---成功   NULL---失败
  -------------------------------------------------------------------------------------
  第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
  
  8、fock函数:在网络服务器中,一个服务端口可以允许一定数量的客户端同时连接,这时单进程是不可能实现的,而fock就分配一个子进程和客户端会话,当然,这只是fock的一个典型应用。
  -------------------------------------------------------------------

[1] [2] [3] 下一页

[ 收藏此页到: 天天|和讯|博采|ViVi|狐摘|我摘|天极 ] 文章录入:kinda    责任编辑:kinda 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
     LinuxC编程---网络编程[2387]
     Linux的Find[1927]
     grub简单应用[1192]
     硬件安装指南[1129]
     SmoothWall2.0(强烈推[1083]
     部分的ADSL路由器默认[1027]
     从硬盘安装Linux和从G[956]
     Linux常见命令:进程查[841]
     黑客帝国屏保[770]
     elf文件格式-- 1[707]
    相 关 文 章
    WindowsNT/2000/XP的密码恢
    在SCSI硬盘上装Windows200
    Windows2000的启动优化(图
    Windows2000的“隐形”武器
    Windows2000的“隐形”武器
    Win2K服务器端设置教程第八
    WIN2kADVANCEDSERVER群集安
    Win2000Server入侵监测
    经验之谈:当Windows2000不
    五则实用的Windows2000操作
    保持高度一致Windows同步功
    优化Windows2000启动缩短启
    用cdrwin制作Windows2000启
    Windows2000自带传真软件使
    Windows2000之内存优化
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)