Linux操作系统中BSD套接口开发的基础介绍

2016-01-29 19:05 6 1 收藏

Linux操作系统中BSD套接口开发的基础介绍,Linux操作系统中BSD套接口开发的基础介绍

【 tulaoshi.com - Linux 】

 

  这是关于如何用各种可以得到的接口为Linux开发网络程序的系列文章的第一篇。就像大多数Unix-based的操作系统一样,Linux支持将TCP/IP作为本地的网络传输协议。在这个系列中,我们假定你已经比较熟悉Linux上的C编程和Linux的一些系统知识诸如signals,forking等等。

  这篇文章是关于如何用BSD套接口创建网络程序的基础介绍 。在下一篇中,我们会解决涉及到建立(网络)deamon进程的问题。而且今后的文章我们还会涉及到使用远程过程调用(RPC),以及用CORBA/distributed objects进行开发。

  一、TCP/IP的基础介绍

  TCP/IP协议族允许两个运行在同一台电脑或者由网络连接在一起的两台电脑上的程序进行通讯。这个协议族是专门为了在不可靠的网络上进行通讯设计的。TCP/IP允许两个基本的操作模式——面向连接的可靠的传输(指TCP)和无连接的(connectionless)不可靠的传输(UDP)。

  TCP提供带有对上层协议透明的中继功能的,顺序的,可靠的,双向的(bi-directional),以连接为基础的字节传输流。TCP将你的信息分割成数据报(不大于64kb)并保证所有的数据报无误的按照顺序都到达目的地。由于以连接为基础,所以一个虚拟连接必须在一个网络实体(network entity)和另一个之间进行通信前建立。UDP相反则提供一个(非常快的)无连接的不可靠消息传输(消息的大小是一个确定的最大长度)。

  为了使程序间可以相互通信,不论他们是在同一个机器(通过loopback接口)还是不同主机,每一个程序都必须有独立的地址。

  TCP/IP地址由两部分组成——用来辨别机器的IP地址和用来辨别在那台机器上的特定程序的端口地址。

  地址可以是点分(dotted-quad)符号形式的(如,127.0.0.1)或者是主机名形式的(如,www.csdn.net)。系统可以使用/etc/hosts或DNS域名服务(如果可以获得的话)进行主机名到点分符号地址(也就是IP地址)的转换。

  端口从1号开始编号。1和IPP0RT_RESERVED(在/usr/include/netinet/in.h中定义,通常为1024)之间的段口号保留给系统使用(也就是说,你必须以root的身份建立一个网络服务来绑定这部分的端口)。

  最简单的网络程序大都用的客户-服务器模型。一个服务进程等待一个客户进程连接他。当连接建立时,服务器代表客户执行特定的任务,通常这这以后连接就中断了。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

  二、使用BSD套接口界面

  最通行的TCP/IP编程方法就是使用BSD套接口界面编程。通过它,网络端点(network endpoints)(IP地址和端口地址)以套接口(sockets)的形式出现。

  这套套接口IPC(interprocess communication,进程间通讯)设施(从4.2BSD开始引入)的设计是为了能让网络程序的设计能够独立于不同的底层通信设施。

  1、建立一个服务器程序

  要使用BSD界面建立一个服务器程序,你必须通过以下步骤:

  (1)通过函数socket()建立一个套接口
  (2)通过函数bind()绑定一个地址(IP地址和端口地址)。这一步确定了服务器的位置,使客户端知道如何访问。
  (3)通过函数listem()监听(listen)端口的新的连接请求。
  (4)通过函数accept()接受新的连接。

  通常,维护代表了客户的请求可能需要花费相当长的一段时间。在处理一个请求时,接收和处理新的请求也应该是高效的。达到这种目的的最通常的做法是让服务器通过fork()函数拷贝一份自己的进程来接受新的连接。

  以下的例子显示了服务器是如何用C实现的:

/*
 * Simple "Hello, World!" server
 * Ivan Griffin (ivan.griffin@ul.ie)
 */

/* Hellwolf Misty translated */

#include  /* */
#include  /* exit() */
#include  /* memset(), memcpy() */
#include  /* uname() */
#include
#include  /* socket(), bind(),
               listen(), accept() */
#include
#include
#include
#include  /* fork(), write(), close() */


/*
 * constants
 */
const char MESSAGE[] = "Hello, World!n";
const int BACK_LOG = 5;

/*


 *程序需要一个命令行参数:需要绑定的端口号
 */
int main(int argc, char *argv[])
{
  int serverSocket = 0,
    on = 0,
    port = 0,
    status = 0,
    childPid = 0;
  struct hostent *hostPtr = NULL;
  char  hostname[80] = "";
  struct sockaddr_in serverName = { 0 };

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/linux/)

  if (2 != argc)
  {
    fprintf(stderr, "Usage: %s n",
  argv[0]);
    exit(1);
  }
  port = atoi(argv[1]);
/ *
  *socket()系统调用,带有三个参数:
  *    1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
  *      PF_INET6(IPv6)等
&n

来源:http://www.tulaoshi.com/n/20160129/1508414.html

延伸阅读
top top命令可实时地显示Linux系统的进程、CPU、内存、负载等的信息。它是我们了解系统整体状态最好的工具。 top命令的运行状态是一个实时的显示过程,我们可在这个界面监控系统运行情况。我们可通过几个按键来控制top命令,如按q可退出top命令状态,按s可输入信息的更新频率等。这些命令可按h帮助键查询。 Ps ps命令...
     在70年代,Unix体系的源程序大多是可以任意流传的。互联网的基础协议TCP/IP就是产生于那个年代。在那个时期,人们在创作各自的"程序作品"中享受着从事科学探索、创新活动所特有的那种激情和成就感。那时的程序员,如同作家一样,急于"发表"自己的程序作品,并不专注于保守"机密",以换取钱财。 1979年,AT&T宣布...
传真是企业中的常规应用,许多商贸往来的信息交换都需要利用传真来完成,但是却不可能为每个人配备一台传真机。用Linux系统可以建立一个人人都可以使用的传真服务器系统。 条件: 1、Linux操作系统 2、efax服务器 3、支持1、2类传真的调制解调器 安装好的RedHat 6操作系统中已经完整地配置好了传真系统,关键是将...
标签: 电脑入门
系统中首先要安装过相应的播放软件及解码器。 比如: mplayer和Xine. 1.安装 mplayerplug-in for mozilla 可以在Firefox中在地址栏输入about:plugins 来查看安装的插件 2.安装 Firefox 扩展mediawrap 下载页面 http://addons.mozine.cn/firefox/116/ mediawrap 是一个很小的 Firefox 扩展。它能够将 ActiveX 控...
问:术语GUI,window manager,desktop和interface间的区别(如果有的话),它们和X window有什么关系? 答:在X的世界里,事物是分成很多组件的,而不象其他的操作系统那样,任何东西都是OS的一个部分。 这里是一些定义: Interface是一个普通术语,意思是指在计算机系统的两个互不依赖的组件间的连结,一个桥。它通常用来指“user interf...

经验教程

724

收藏

6
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部