微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于UDP协议的ARM与X86平台之间的通讯方案

基于UDP协议的ARM与X86平台之间的通讯方案

时间:03-14 来源:IC猫 点击:

Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值"0".Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

  Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。

  两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。

  3.2 配置Socket

  通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket.面向连接的socket客户端通过调用Connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。

  Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。

  Bind函数原型为:

  int bind(int sockfd,struct sockaddr*my_addr,int addrlen);

  Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为3.3 建立连接

  面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为:

  int connect(int sockfd,struct sockaddr*serv_addr,int addrlen);

  Sockfd是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。

  Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器的IP地址,而客户通过哪个端口与服务器建立连接并不需要关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到达端口。

  Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。

  Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。

  int listen(int sockfd,int backlog);

  首先,当accept函数监视的socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的初始socket仍可以继续在以前的socket上监听,同时可以在新的socket描述符上进行数据传输操作。

  3.4 传输数据

  Send()和recv()这两个函数用于面向连接的socket上进行数据传输。

  Sockfd是你用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位数据的长度;flags一般情况下设置为0(关于该参数的用法可参照man手册)。

  Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。

  3.5 传输结束

  当所有的数据操作结束以后,你可以调用close()函数来释放该socket,从而停止在该socket上的任何数据操作。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top