0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

嵌入式开发之linux中的网络编程

m3eY_edn_china 来源:互联网 作者:佚名 2017-11-03 09:26 次阅读

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位整数表示,为了转换可以使用下面三个函数:

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

Pv4和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(...);

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Socket函数
    +关注

    关注

    0

    文章

    2

    浏览量

    2899
  • SOCKEt编程
    +关注

    关注

    0

    文章

    3

    浏览量

    1465
  • socket类型
    +关注

    关注

    0

    文章

    1

    浏览量

    1117

原文标题:嵌入式网络编程技巧解析

文章出处:【微信号:edn-china,微信公众号:EDN电子技术设计】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式开发入门之旅

      课程目标:本次免费体验课程将按照嵌入式开发设计的流程,从嵌入式开发基本概念、嵌入式项目流程详解、嵌入式ARM处理器开发基础、
    发表于 07-09 16:57

    嵌入式开发入门之旅

    、文件系统制作与移植、图形化Linux应用程序的开发入门这几个角度,将学员带入嵌入式开发这个技术新领域,让学员领略嵌入式技术的魅力,使学员对嵌入式开
    发表于 07-10 15:59

    嵌入式开发要学什么内容 嵌入式开发学习路线介绍

    linux内核编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够
    发表于 03-01 10:13

    嵌入式开发Linux基础讲解视频教程分享!

    操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。本教程主要内容讲解了
    发表于 05-31 14:48

    嵌入式开发要学什么内容 嵌入式开发学习路线介绍

    编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。  上述六大步骤适用于自学
    发表于 06-30 10:07

    嵌入式开发要学什么内容 嵌入式开发学习路线介绍

    编程范畴的,因而是对linux内核和内核编程是有要求的。在学习前你要想了解linux内核的组成,因为每一部分要详细研究的话足够可以扩展成一本厚书。  上述六大步骤适用于自学
    发表于 07-27 09:49

    嵌入式开发要学什么?

    你受益匪浅。  1.安装一个Linux的发行版本,能够熟悉使用Linux,掌握Linux下的目录结构、基本命令、编辑器VI、编译器GCC、调试器GDB和Make项目管理工具以及嵌入式开发
    发表于 09-06 16:21

    新手学习嵌入式开发要学什么

    、Web编程开发等方面入手,可以全面了解Linux网络应用程序开发。  2数据结构与算法 数据结构及算法在
    发表于 10-19 09:54

    Linux嵌入式开发环境有哪些?

    Linux嵌入式系统的对常见的几种嵌入式开发环境一定不会默生,由于主要接触网络相关产品的一些系统设计,因此,将可能用到的嵌入式开发环境简要
    发表于 10-29 08:05

    linux驱动开发嵌入式开发用到哪些知识

    嵌入式软件工程师完全学习指南核心:linux基础+C语言linux应用程序开发(系统编程网络
    发表于 10-27 10:14

    嵌入式LINUX开发步骤有哪些

    第一学习阶段,主要打好基础,学好C编程Linux系统编程。1、C语言编程基础2、嵌入式开发基础:Lin
    发表于 11-05 09:22

    浅析基于linux嵌入式开发

    序言:学习基于linux平台的嵌入式开发之前我已经经过了基于纯单片机开发》》》基于实时系统ucosIII、freeRTOS平台的嵌入式开发两个阶段的学习和实战。基于
    发表于 11-05 06:49

    嵌入式网络编程+嵌入式Linux系统

    D2.25嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、
    发表于 12-22 07:10

    嵌入式LInux网络编程

    嵌入式LInux网络编程 嵌入式工程师、嵌入式讲师、10多年
    发表于 12-22 08:17

    Linux下C编程 嵌入式开发

    Linux下C编程 嵌入式开发
    发表于 10-31 09:35 31次下载
    <b class='flag-5'>Linux</b>下C<b class='flag-5'>编程</b> <b class='flag-5'>嵌入式开发</b>