一 :套接字属性

套接字由域(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网络编程 华清,Linux网络编程之套接字相关推荐

  1. python套接字编程_Python套接字编程(1)——socket模块与套接字编程

    在Python网络编程系列,我们主要学习以下内容: 5. 常见的Python异步编程框架 6. 协程在Python网络编程中的使用 本文介绍Python下的基本套接字编程,主要基于 socket 模块 ...

  2. linux网络编程 华清,网络编程(华清远见内部培训资料).ppt

    网络编程(华清远见内部培训资料) 地址结构的一般用法 定义一个struct sockaddr_in类型的变量并清空 struct sockaddr_in myaddr; memset(&mya ...

  3. linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时

    一.使用alarm 函数设置超时 C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13   void handler( int sig) { } signal(SIGALRM ...

  4. Day09: socket网络编程-OSI七层协议,tcp/udp套接字,tcp粘包问题,socketserver

    今日内容:socket网络编程     1.OSI七层协议     2.基于tcp协议的套接字通信     3.模拟ssh远程执行命令     4.tcp的粘包问题及解决方案     5.基于udp协 ...

  5. 《UNIX网络编程》读书笔记——第三章 套接字编程简介

    第三章   套接字编程简介 一.套接字地址结构 以socket_in命名,定义在<netinet/in.h>头文件中. struct in_addr{ in_addr_t s_addr:} ...

  6. 网络编程------IP地址,端口号,套接字,网络字节序

    IP地址         IP地址是IP协议中,用来标识网络中的唯一一台主机的地址.IP协议有两个版本IPv4,IPv6.在IPv4中,IP地址是一个4字节的32位的整数.在IPv6中,IP地址是一个 ...

  7. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  8. 网络编程(part11)--socket模块方法及socket套接字属性

    鄙人学习笔记 文章目录 socket模块方法及socket套接字属性 部分socket模块方法 举个例子 套接字属性 举个例子 写个案例 socket模块方法及socket套接字属性 部分socket ...

  9. 套接字编程---2(TCP套接字编程的流程,TCP套接字编程中的接口函数,TCP套接字的实现,TCP套接字出现的问题,TCP套接字多进程版本,TCP套接字多线程版本)

    TCP模型创建流程图 TCP套接字编程中的接口 socket 函数 #include <sys/types.h> /* See NOTES */ #include <sys/sock ...

最新文章

  1. DataSet 去除重复的行
  2. 【转】C 编译器优化过程中的 Bug
  3. 触手直播停服,游戏主播们涌入快手
  4. 大学生必须要知道的毕业设计基本流程
  5. 2021李宏毅机器学习课程笔记——Recurrent Neural Network
  6. 程序员爬取 3 万条评论,《长安十二时辰》槽点大揭秘!
  7. redis两种持久化模式
  8. [转载]CMMI之功能点估算法:EI、EQ和EO
  9. AOP切面五大通知类型
  10. java qq 实现消息发送_java如何实现qq发送消息
  11. 玩机搞机----安卓全机型修改开机第一屏步骤教程
  12. 《操作系统真象还原》第九章 ---- 终进入线程动斧开刀 豁然开朗拨云见日 还需解决同步机制才能长舒气
  13. Linux云计算虚拟化-使用rancher搭建k8s集群并发布电商网站
  14. u盘插上去计算机没有,正常U盘插入电脑没反应?u盘插上没反应的绝对有效解决方法-太平洋电脑网...
  15. 途牛2021年第三季度营收约1亿元,同比、环比均有所下降
  16. 联想拯救者笔记本解锁M.2 nvme接口性能
  17. OpenStack Heat服务介绍
  18. 石英晶振为何应用于风扇
  19. Oracle字符串连接的方法
  20. Github实用Android开源项目推荐(三)

热门文章

  1. 计算机科技新闻,新浪网_科技时代_计算机_新闻报道
  2. linux 网卡 巨帧,Linux Kernel e1000e驱动巨型帧处理绕过安全检查漏洞
  3. 现代软件工程讲义 8 稳定阶段 (测试的计划和执行)
  4. python元祖用法_Python序列(列表list和元组tuple)用法完全攻略
  5. python获取钉钉日志数据_python3实现zabbix告警推送钉钉的示例
  6. 求有向图的简单路径_2020福建农信社招聘-关键路径
  7. python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
  8. Linux系统常用的基本命令【转载CSDN象在舞】
  9. win10 如何锁定计算机,Win10 1909 专业版怎么锁定计算机屏幕
  10. linux更改nginx最大访问数,Linux下nginx服务的配置文件nginx.conf中模块的讲解之配置limit_conn_zone来限制并发连接数以及下载速率...