当前位置:  操作系统/服务器>linux

linux网络编程用到的网络函数详解用和使用示例

    来源: 互联网  发布时间:2014-10-14

    本文导语:  一.概念介绍网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。我们编写网络程序时,一般是...

一.概念介绍
网络程序分为服务端程序和客户端程序。服务端即提供服务的一方,客户端为请求服务的一方。但实际情况是有些程序的客户端、服务器端角色不是这么明显,即互为客户端和服务端。
我们编写网络程序时,一般是基于TCP协议或者UDP协议进行网络通信的。
TCP:(Transfer Control Protocol)传输控制协议是一种面向连接的协议, 当我们的网络程序使用这个协议的时候,网络可以保证我们的客户端和服务端之间的传输是可靠的。
UDP:(User Datagram Protocol)用户数据报协议是一种非面向连接的协议, 这种协议并不能保证我们的网络程序的连接是可靠的。
我们编写的网络程序具体采用哪一类协议,要视具体情况而定。比如,如果是大数据量的通信,而且对数据的完整性要求不是特别高,则可以采用UDP协议,以得到更快的传输速率。如果我们是要实现一些诸如文件传输、社交通讯之类的功能,就需要采用TCP协议通信,以保证传输的可靠性。

二.初等网络函数介绍
int socket(int domain, int type,int protocol)
  domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等).
        AF_UNIX只能够用于单一的Unix 系统进程间通信,
        而AF_INET是针对Internet的,因而可以允许在远程
        主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现所以用PF代替了AF,
        不过我们都可以使用的).
  type:我们网络程序所采用的通讯协议(SOCK_STREAM,SOCK_DGRAM等)
        SOCK_STREAM表明我们用的是TCP 协议,这样会提供按顺序的,可靠,双向,面向连接的比特流.
        SOCK_DGRAM 表明我们用的是UDP协议,这样只会提供定长的,不可靠,无连接的通信.
  protocol:由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了 socket为网络通讯做基本的准备.
  成功时返回文件描述符,失败时返回-1,看errno可知道出错的详细情况.

int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
  sockfd:是由socket调用返回的文件描述符.
  addrlen:是sockaddr结构的长度.
  my_addr:是一个指向sockaddr的指针. 在中有 sockaddr的定义
        struct sockaddr{
                unisgned short  as_family;
                char            sa_data[14];
        };
  不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义
        struct sockaddr_in{
                unsigned short          sin_family;    
                unsigned short int      sin_port;
                struct in_addr          sin_addr;
                unsigned char           sin_zero[8];
        }
  我们主要使用Internet所以
        sin_family一般为AF_INET,
        sin_addr设置为INADDR_ANY表示可以和任何的主机通信,
        sin_port是我们要监听的端口号.sin_zero[8]是用来填充的.
  bind将本地的端口同socket返回的文件描述符捆绑在一起.成功是返回0,失败的情况和socket一样

int listen(int sockfd,int backlog)
  sockfd:是bind后的文件描述符.
  backlog:设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度.
  listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.

int accept(int sockfd, struct sockaddr *addr,int *addrlen)
  sockfd:是listen后的文件描述符.
  addr,addrlen是用来给客户端的程序填写的,服务器端只要传递指针就可以了. bind,listen和accept是服务器端用的函数,
  accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,
  这个时候服务器端可以向该描述符写信息了. 失败时返回-1

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen)
   sockfd:socket返回的文件描述符.
   serv_addr:储存了服务器端的连接信息.其中sin_add是服务端的地址
   addrlen:serv_addr的长度
   connect函数是客户端用来同服务端连接的.成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1.

更多函数请查看man …….
代码如下:

int getaddrinfo(const char *node, const char *service,
                      const struct addrinfo *hints,
                      struct addrinfo **res);


三.初等网络函数使用实例
一个教科书式的服务器端程序流程为:
建立套接字socket()--->将套接字绑定到ip地址bind()----->建立监听套接字listen()------>开始等待客户端请求accpet()
详细代码如下:
代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
   int sockfd,connfd;
  struct sockaddr_in srvaddr;
  struct sockaddr_in cliaddr;
  int len,port;
  char hello[]="Hi,welcome to linux-code!n";
  if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    fprintf(stderr,"Socket error:%sna",strerror(errno));
    exit(1);
   }
  /* 服务器端填充 sockaddr结构 */
   bzero(&srvaddr,sizeof(struct sockaddr_in));
  srvaddr.sin_family=AF_INET;
  srvaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   srvaddr.sin_port=htons(1113);
  /* 捆绑sockfd描述符 */
   if(bind(sockfd,(struct sockaddr *)(&srvaddr),sizeof(struct sockaddr))==-1){
     fprintf(stderr,"Bind error:%sna",strerror(errno));
     exit(1);
  }
  /* 监听sockfd描述符 */
   if(listen(sockfd,5)==-1){
    fprintf(stderr,"Listen error:%sna",strerror(errno));
    exit(1);
  }
  len=sizeof(struct sockaddr_in);
  while(1){ /* 服务器阻塞,直到客户程序建立连接 */
    if((connfd=accept(sockfd,(struct sockaddr *)(&cliaddr),&len))==-1){
      fprintf(stderr,"Accept error:%sna",strerror(errno));
      exit(1);
     }
    fprintf(stderr,"Server get connection from %sn",inet_ntoa(cliaddr.sin_addr));
     if(write(connfd,hello,strlen(hello))==-1){
      fprintf(stderr,"Write Error:%sn",strerror(errno));
      exit(1);
     }
     /* 这个通讯已经结束 */
     close(connfd);
    /* 循环下一个 */
   }
  close(sockfd);
  exit(0);
}

一个教科书式的客户端程序流程为:
建立套接字socket()--->与服务器建立连接connect()
详细代码如下:
代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
  int sockfd; char buf[1024];
  struct sockaddr_in srvaddr;
   struct hostent *phost; int nbytes;
   if(argc!=3){
    fprintf(stderr,"Usage:%s an",argv[0]);
    exit(1);
   }
   /* 客户程序开始建立 sockfd描述符 */
   if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
    fprintf(stderr,"socket Error:%san",strerror(errno));
     exit(1);
   }
   /* 客户程序填充服务端的资料 */
   bzero(&srvaddr,sizeof(srvaddr));
  srvaddr.sin_family=AF_INET;
   srvaddr.sin_port=htons(atoi(argv[2]));
  if (inet_pton(AF_INET, argv[1], &srvaddr.sin_addr)

    
 
 

您可能感兴趣的文章:

  • 请问unix网络编程和linux网络有什么区别
  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • 《UNIX网络编程》这本书适合linux下的网络编程吗?
  • 【linux视频教程整套10个视频】linux网络及安全管理
  • linux下双网卡分别连不同的网络,如何设定对于某个目标ip,走特定的网络
  • [疑问] [linux网络连接]Linuxmint网络连接
  • linux内核中网络模块的学习
  • 我的专业是网络技术,对TCP/IP有一定的了解但不精,想要学习linux下的网络编程,请大家推荐学习方法和优秀的书籍
  • 学习linux网络驱动开发有哪些比较好的书籍?
  • Unix/Linux网络编程怎样来做一个项目?
  • flyingcrean,来讲一下Linux网络分析。
  • 那里有linux c 函数库和linux 网络编程的书下载??
  • 求解linux的网络设置
  • 新手请教,linux网络编程。
  • Linux C++ 网络库 Muduo
  • linux环境进行网络编程的教材
  • Red Hat9 linux 访问网络非常慢
  • 有关配置红旗LINUX网络的问题,
  • xp host + vmware linux 的网络连接设置
  • linux 重启与重启网络的区别
  • 学习Linux的网络编程,请问使用哪个公司的linux最好?
  • 求介绍linux下的网络编程书
  • 求助linux下的网络编程问题
  • 请有经验的朋友推荐一下Linux/Nnix下网络编程方面的书,急需学习
  • 求助:linux/unix网络编程
  • 帮推荐一本linux 网络编程的经典书吧
  • 会Linux下网络编程,能找到什么样的工作,从事什么?
  • Unix/Linux网络编程可以用来做什么?一般从事什么样的职业?
  • 学习linux网络编程需要学习些内核知识吗?
  • 哪里可以免费下载Linux下C网络编程方面的好书?
  • linux 网络编程的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux c++虚函数(virtual function)简单用法示例代码
  • linux下运行libnids那个自带的示例程序printall,有点问题
  • linux c 生成随机数srand函数和rand函数介绍及代码示例
  • 求LINUX下RS232通信的示例代码
  • Linux系统命令:find(文件查找命令)介绍及用法示例
  • linux使用shell脚本,如何创建用户,并设置用户密码?能否给出示例?
  • 诚求<<LINUX编程宝典>>的示例代码!!!
  • unp(unix network programming)中的示例是针对 BSD 的,如何移植到 LINUX 上来?
  • 谁有《linux设备驱动程序》书的示例代码,发给我好么?
  • linux c 获得当前进程的进程名和执行路径(示例)
  • linux增加iptables防火墙规则的示例
  • 问一个《linux设备驱动程序第三版》第二章中运行那个示例模块的问题
  • linux下php与php-fpm安装配置示例
  • linux生成(加载)动态库静态库和加载示例方法
  • linux获取系统启动时间示例详解
  • linux获取进程执行时间方法示例
  • Linux网络编程之UDP Socket程序示例
  • Linux网络编程之socket文件传输示例
  • Linux网络编程之基于UDP实现可靠的文件传输示例
  • linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)
  • 利用linux的timerfd_create实现计时器示例分享
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3