当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > Linux网络编程之套接字

Linux网络编程之套接字 时间:2014-10-21      来源:未知

一 :套接字属性

套接字由域(domain),类型(type)和协议(protocol)三个属性确定其特性。

1)套接字的域

域指定套接字通信中使用的网络 介质,常见的套接字域是AF_INET,它指的是互联网络,许多LINUX局域网使用的都是该网络。

服务器上可能同时有多个服务正在运行,客户可以通过IP端口来指定一台联网机器上的某个特定服务。在系统内部,端口通过分配一个唯一的16位整数来标识,在系统外部,则需要通过IP地址和端口号的组合来确定。套接字作为通信的终点,它必须在开始通信之前绑定一个端口。

服务器在特定的端口等待客户的连接,知名服务器所分配的端口号在所有LINUX和UNIX机器上都是一样的,它们通常(但并不总是如此)小于1024,一般情况下,小于1024的端口号都是为系统服务保留的,并且所服务的进程必须具有超级用户权限。

其它可以使用的域如AF_UNIX,AF_ISO,AF_XFA等。

2)套接字类型

套接字有三种类型:流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM)及原始套接字。

1、流式套接字(SOCK_STREAM)

流式套接字提供的是一个有序,可靠,双向字节流的连接。因此,发送的数据可以确保不会丢失,复制或乱序到达,并且在这一过程 中发生的错误也不会显示出来。流式套接字由类型SOCK_STREAM指定,它们是地AF_INET域中通过TCP/IP连接来实现的,它们也是AF_UNIX域中常用的套接字类型。

2、数据报套接字(SOCK_DGRAM)

与此相反 ,由SOCK_DGRAM指定的数据报套接字不建立和维持一个连接,它寻可以发送的数据报的长度有限制。数据报作为一个单独的网络消息被传输,它可能会丢失,复制或乱序到达。数据报套接字是在AF_INET域中通过UDP/IP连接来实现的,它提供的是一种无序的不可靠服务,但从资源的角度来看,相对来说它们开销比较小,因为不需要维持网络连接,而且因为无需花费时间来建立连接,它们的速度也很快。

3、原始套接字

二 :套接字协议

只要底层传输机制允许不止一个协议来提供所要求的套接字类型,就可以为套接字选择一个特定的协议。我们重点讨论UNIX网络套接字和文件系统套接字,它们不需要你 选择一个特定的协议,只需要使用其默认值即可。

三 :创建套接字

socket系统调用创建一个套接字并返回一个描述符,该描述符可以用来访问该套接字。
        #include < sys/types.h>
        #include < sys/socket.h>
        socket函数原型为:
        int socket(int domain, int type, int protocol);

domain参数指定socket的类型,一般为AF_INET,type可以是SOCK_STREAM 或SOCK_DGRAM,分别表示TCP连接和UDP连接;protocol通常赋值"0"。Socket()调用返回一个整型socket描述符,你可 以在后面的调用使用它。

一旦通过socket调用返回一个socket描述符,你应该将该socket与你本机上的一个端口相关联(往往当你在设计服务器端程序时需要调用该函数。随后你就可以在该端口监听服务请求;而客户端一般无须调用该函数)。

五:套接字地址

每个套接字域都有其自己的地址格式。对于AF_INET域来说,套接字地址由结构sockaddr_in来指定,该结构在头文件netinet/in.h中定义。

我们要讨论的第一个结构类型是:struct sockaddr,该类型是用来保存socket信息的:
        struct sockaddr
        { 
          unsigned short sa_family; /* 地址族, AF_xxx */ 
             char sa_data[14]; /* 14 字节的协议地址 */
        };

sa_family一般为AF_INET;sa_data则包含该socket的IP地址和端口号。

另外还有一种结构类型:
        struct sockaddr_in
        { 
          short int sin_ family; /* 地址族 */ 
           unsigned short int sin_port; /* 端口号 */ 
           struct in_addr sin_addr; /* IP地址 */ 
           unsigned char sin_zero[8]; /* 填充0 以保持与struct sockaddr同样大小 */ 
   };

这个结构使用更为方便。sin_zero(它用来将sockaddr_in结构填充到与struct sockaddr同样的长度)应该用bzero()或memset()函数将其置为零。指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。sin_family通常被赋AF_INET;sin_port和 sin_addr应该转换成为网络字节优先顺序 。

IP地址结构struct in_addr被定义为:
        struct in_addr
        {
                unsigned long int s_addr;
         };

IP地址中的四个字节组成一个32位的值。

这是几个字节顺序转换函数:
        htons()--"Host to Network Short" ; htonl()--"Host to Network Long" 
  ntohs()--"Network to Host Short" ; ntohl()--"Network to Host Long"

在这里,h表示"host" ,n表示"network",s 表示"short",l表示 "long"。

上一篇:删除固件中的初始程序

下一篇:linux下的rtc机制

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部