新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式Linux网络编程之:网络基础编程

嵌入式Linux网络编程之:网络基础编程

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257116.htm

(3)使用实例。

下面的实例给出了getaddrinfo函数用法的示例,在后面小节中会给出gethostbyname函数用法的例子。

/*getaddrinfo.c*/

#includestdio.h>

#includestdlib.h>

#includeerrno.h>

#includestring.h>

#includenetdb.h>

#includesys/types.h>

#includenetinet/in.h>

#includesys/socket.h>

intmain()

{

structaddrinfohints,*res=NULL;

intrc;

memset(hints,0,sizeof(hints));

/*设置addrinfo结构体中各参数*/

hints.ai_flags=AI_CANONNAME;

hints.ai_family=AF_UNSPEC;

hints.ai_socktype=SOCK_DGRAM;

hints.ai_protocol=IPPROTO_UDP;

/*调用getaddinfo函数*/

rc=getaddrinfo(localhost,NULL,hints,res);

if(rc!=0)

{

perror(getaddrinfo);

exit(1);

}

else

{

printf(Hostnameis%sn,res->ai_canonname);

}

exit(0);

}

10.2.3socket基础编程

(1)函数说明。

socket编程的基本函数有socket()、bind()、listen()、accept()、send()、sendto()、recv()以及recvfrom()等,其中根据客户端还是服务端,或者根据使用TCP协议还是UDP协议,这些函数的调用流程都有所区别,这里先对每个函数进行说明,再给出各种情况下使用的流程图。

n socket():该函数用于建立一个socket连接,可指定socket类型等信息。在建立了socket连接之后,可对sockaddr或sockaddr_in结构进行初始化,以保存所建立的socket地址信息。

n bind():该函数是用于将本地IP地址绑定到端口号,若绑定其他IP地址则不能成功。另外,它主要用于TCP的连接,而在UDP的连接中则无必要。

n listen():在服务端程序成功建立套接字和与地址进行绑定之后,还需要准备在该套接字上接收新的连接请求。此时调用listen()函数来创建一个等待队列,在其中存放未处理的客户端连接请求。

n accept():服务端程序调用listen()函数创建等待队列之后,调用accept()函数等待并接收客户端的连接请求。它通常从由bind()所创建的等待队列中取出第一个未处理的连接请求。

n connect():该函数在TCP中是用于bind()的之后的client端,用于与服务器端建立连接,而在UDP中由于没有了bind()函数,因此用connect()有点类似bind()函数的作用。

n send()和recv():这两个函数分别用于发送和接收数据,可以用在TCP中,也可以用在UDP中。当用在UDP时,可以在connect()函数建立连接之后再用。

n sendto()和recvfrom():这两个函数的作用与send()和recv()函数类似,也可以用在TCP和UDP中。当用在TCP时,后面的几个与地址有关参数不起作用,函数作用等同于send()和recv();当用在UDP时,可以用在之前没有使用connect()的情况下,这两个函数可以自动寻找指定地址并进行连接。

服务器端和客户端使用TCP协议的流程如图10.6所示。

服务器端和客户端使用UDP协议的流程如图10.7所示。

图10.6使用TCP协议socket编程流程图图10.7使用UDP协议socket编程流程图

(2)函数格式。

表10.8列出了socket()函数的语法要点。

表10.8 socket()函数语法要点

所需头文件

#includesys/socket.h>

函数原型

intsocket(intfamily,inttype,intprotocol)

函数传入值

family:

协议族

AF_INET:IPv4协议

AF_INET6:IPv6协议

AF_LOCAL:UNIX域协议

AF_ROUTE:路由套接字(socket)

AF_KEY:密钥套接字(socket)

type:

套接字类型

SOCK_STREAM:字节流套接字socket

SOCK_DGRAM:数据报套接字socket

SOCK_RAW:原始套接字socket

protoco:0(原始套接字除外)

函数返回值

成功:非负套接字描述符

出错:-1

表10.9列出了bind()函数的语法要点。

表10.9 bind()函数语法要点

所需头文件

#includesys/socket.h>

函数原型

intbind(intsockfd,structsockaddr*my_addr,intaddrlen)

函数传入值

socktd:套接字描述符

my_addr:本地地址

addrlen:地址长度

函数返回值

成功:0

出错:-1

端口号和地址在my_addr中给出了,若不指定地址,则内核随意分配一个临时端口给该应用程序。

表10.10列出了listen()函数的语法要点。

表10.10 listen()函数语法要点

所需头文件

#includesys/socket.h>

函数原型

intlisten(intsockfd,intbacklog)

函数传入值

socktd:套接字描述符

backlog:请求队列中允许的最大请求数,大多数系统缺省值为5

函数返回值

成功:0

出错:-1

表10.11列出了accept()函数的语法要点。

表10.11 accept()函数语法要点

所需头文件

#includesys/socket.h>

函数原型

intaccept(intsockfd,structsockaddr*addr,socklen_t*addrlen)

函数传入值

socktd:套接字描述符

addr:客户端地址

addrlen:地址长度

函数返回值

成功:0

出错:-1

表10.12列出了connect()函数的语法要点。

表10.12 connect()函数语法要点

所需头文件

#includesys/socket.h>

函数原型

intconnect(intsockfd,structsockaddr*serv_addr,intaddrlen)

函数传入值

socktd:套接字描述符

serv_addr:服务器端地址

addrlen:地址长度

函数返回值

成功:0

出错:-1

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

linux相关文章:linux教程




评论


相关推荐

技术专区

关闭