基于uCLinux和S3C4510B的网络通信设计
上一个IP头,并且知道如何把传入的IP包送给TCP或者UDP协议。在IP层以下,就是网络设备来支持所有的Linux网络工作,如PLIP、SLIP和以太网。
3 uClinux环境下的socket编程
网络的socket数据b传输是一种特殊的I/O,socket也是一种文件描述符,也具有一个类似文件的函数调用socket()。该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket函数实现的。常用的socket类型有两种:流式socket和数据报式socket。两者的区别在于:前者对应于TCP服务,后者对应于UDP服务。
3.1 uCLinux中socket编程中用到的函数
(1) socket函数
为了执行I/O,一个进程必须做的第一件事情就是调用socket函数,指定期望的通信协议类型(使用IPv4的TCP、使用IPv6的UDP、Unix域字节流协议等),其函数结构如下:int socket(int family,int type,int protocol);
/*返回:非负描述字—成功,-1—出错*/
代码中的family指明协议族。套接口的类型type是某个常值。一般来说,函数socket的参数protocol主设置为0,socket函数成功时返回一个小的非负整数值。为了得到这个数值,我们指定协议族(IPv4IP、v6或Unix)和套接口类型(字节流、数据报或原始套接口)。
(2)connect函数
TCP客户用connect函数来建立一个与TCP服务器的连接。
Int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);/*返回:0—成功,-1—出错*/
Sockfd由socket函数返回数值,第二、第三个参数分别是一个批晌套接口地址结构的指针和该结构的大小。套接口叶址结构必须含有服务器的IP地址和端口号。
(3)bind函数
函数bind给套接口分配一个本地协议地址。对于网际协议,协议地址是非颠倒2位IPv4地址16位的TCP或UDP端口号的组合。
Int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);/*返回:0—成功,-1—出错*/
第二个参数量个指向特定于协议地址结构的指针,第三个参数是该地址结构的长度。对于TCP,调用函数bind可以指定一个端口,指定一个IP地址。可以两者都指定,也可以一个也不指定。
(4)listen函数
函数listen仅被除数TCP服务器调用。它做两件事件事情,当函数socket创建一个套接口时,被假设为一个主动套接口。也就是说,它是一个将调用connect发起连接的客户套接口,函数listen将未连接的套接口转换成被动套接口,指示内核应接受指向此套接口的连接请求。根据TCP状态转换调用函数listen导致套接口从CLOSED状态转换到LISEN状态。函数的第二个参数规定了内核为此套接口排队的最大连接个数。
《基于uCLinux和S3C4510B的网络通信设计(第2页)》