您的位置 首页 电源

嵌入式网络编程技巧解析

在Linux中的网络编程是通过socket接口来进行的。是一种文件描述符。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后

在Linux中的网络编程是经过socket接口来进行的。是一种文件描述符。socket也有一个类似于翻开文件的函数调用,该函数回来一个整型的socket描述符,随后的衔接树立、数据传输等操作都是经过socket来完成的。

常见的socket有3种类型:

(1)流式socket (SOCK_STREAM) 流式套接字供给牢靠的、面向衔接的通讯流;它运用TCP协议,然后确保了数据传输的正确性和次序性。

(2)数据报socket(SOCK_DGRAM) 数据报套接字界说了一种无衔接的服务,数据经过彼此独立的报文进行传输,是无序的,而且不确保是牢靠、无差错的。它运用数据报协议UDP

(3)原始socket 原始套接字答应对底层协议如IP或ICMP进行直接拜访,它功能强大但运用较为不方便,首要用于一些协议的开发。

1:sockaddr/_in:是用来 保存 socket 信息的 .在 树立 socketadd 或 sockaddr_in 后,就能够对该 socket 进行恰当的操作了.

struct sockaddr {

unsigned short sa_family; /*地址族*/

char sa_data[14]; /*14 字节的协议地址,包括该 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 相同巨细*/

}; 常用

sa_family有一下几种:

AF_INET:IPv4 协议

AF_INET6:IPv6 协议

AF_LOCAL:UNIX 域协议

AF_LINK:链路地址协议

AF_KEY:密钥套接字(socket)

2.数据存储优先次序

计算机数据存储有两种字节优先次序:高位字节优先(大端方式)和低位字节优先(小段方式)。Internet上以高位字节优先的次序在网络传输,而PC机一般选用小端方式,因而有时候需要对两个字节存储优先次序进行转化。用到了4个函数:htons()、ntohs()、htonl()和ntohl()。h代表host,n代表network,s代表short,l代表long。一般16位的IP端口号用s,而IP地址用l。

函数格局阐明

uint16_t htons(unit16_t host16bit) 参数是主机字节序的16bit数据

uint32_t htonl(unit32_t host32bit) 参数是主机字节序的32bit数据

uint16_t ntohs(unit16_t net16bit) 参数是网络字节序的16bit数据

uint32_t ntohs(unit32_t net32bit) 参数是网络字节序的32bit数据

地址格局转化

IP地址一般由数字加点(192.168.0.1)的方式表明,而在struct in_addr中运用的IP地址是由32位整数表明,为了转化能够运用下面三个函数:

IPv4中用到的函数有inet_aton、inet_addr和inet_ntoa

IPv4和IPv6兼容的函数有inet_pton和inet_ntop,这儿,p表明十进制,n表明二进制。

int inet_pton(int family, const char *strptr, void *addrptr)

int inet_ntop(int family, void *addrptr, char *strptr, size_t len)

family传入AF_INET或AF_INET6,addrptr是转化后的地址,strptr是要转化的值,len是转化后值的巨细,成功回来0,犯错回来-1

int inet_aton(const char *cp,struct in_addr *inp);

char *inet_ntoa(struct in_addr in);

in_addr_t inet_addr(const char *cp);

其间inet_aton将a.b.c.d方式的IP转化为32位的IP,存储在inp指针里边;inet_ntoa是将32位IP转化为a.b.c.d的格局;inet_addr将一个点分十进制的IP转化成一个长整数型数。

姓名地址转化

一般,人们在运用过程中不肯回忆冗长的IP地址,因而,运用主机名是很好的挑选。gethostbyname()将主机名转化为IP地址,gethostbyaddr()则是逆操作,将IP地址转化为主机名。它们都涉及到一个hostent的结构体,如下:

struct hostent

{

char *h_name; /*正式主机名*/

char **h_aliases; /*主机别号*/

int h_addrtype; /*地址类型*/

int h_length; /*地址字节长度*/

char **h_addr_list; /*指向IPv4或IPv6的地址指针数组*/

};

咱们调用gethostbyname()或许gethostbyaddr()后就能回来hostent结构体的相关信息。

3.socket编程的根本函数有socket()、bind()、listen()、accept()、sent()、sendto()、recv()、以及recvfrom()等,详细介绍如下:

根据TCP-服务器:创立socket()—>bind()绑定IP地址、端口信息到socket上—>listen()设置答应最大衔接数—>accept()等候来自客户端的衔接恳求—>send()、recv()或许read()、write()收发数据—>封闭衔接。

根据TCP-客户端:创立socket()—>设置要衔接的服务器IP地址和端口等特点—>connect()衔接服务器—>send()、recv()或read()、write()收发数据—>封闭网络衔接。

循环服务器:服务器在同一时间只能呼应一个客户端的恳求。

socket(…);

bind(…);

listen(…);

while(1)

{

accept(…);

process(…);

close(…);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/131973.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部