嵌入式网络编程

本文详细介绍了在Linux环境下如何进行网络编程,包括socket接口的使用、三种类型的socket、字节序转换函数、地址格式转换以及常用网络编程函数如socket、bind、listen、accept、send和recv等。此外,还讲解了TCP与UDP的服务器和客户端编程流程,以及服务器类型和并发处理策略。
摘要由CSDN通过智能技术生成

在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; 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值