一 :套接字属性
套接字由域(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网络套接字和文件系统套接字,它们不需要你 选择一个特定的协议,只需要使用其默认值即可。
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
点击这里找小助理0元领取:点击文中文的蓝色字体领取呀
三 :创建套接字
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"。
,