微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 嵌入式Linux网络编程之:网络基础编程

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

时间:08-13 来源:3721RD 点击:

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **result)

函数传入值

node:网络地址或者网络主机名

service:服务名或十进制的端口号字符串

hints:服务线索

result:返回结果

函数返回值

成功:0

出错:-1

在调用之前,首先要对hints服务线索进行设置。它是一个addrinfo结构体,表10.7列举了该结构体常见的选项值。

表10.7 addrinfo结构体常见选项值

结构体头文件

#include <netdb.h>

ai_flags

AI_PASSIVE:该套接口是用作被动地打开

AI_CANONNAME:通知getaddrinfo函数返回主机的名字

ai_family

AF_INET:IPv4协议

AF_INET6:IPv6协议

AF_UNSPEC:IPv4或IPv6均可

ai_socktype

SOCK_STREAM:字节流套接字socket(TCP)

SOCK_DGRAM:数据报套接字socket(UDP)

ai_protocol

IPPROTO_IP:IP协议

IPPROTO_IPV4:IPv4协议

4

IPv4

IPPROTO_IPV6:IPv6协议

IPPROTO_UDP:UDP

IPPROTO_TCP:TCP

注意

(1)通常服务器端在调用getaddrinfo()之前,ai_flags设置AI_PASSIVE,用于bind()函数(用于端口和地址的绑定,后面会讲到),主机名nodename通常会设置为NULL。

(2)客户端调用getaddrinfo()时,ai_flags一般不设置AI_PASSIVE,但是主机名nodename和服务名servname(端口)则应该不为空。

(3) 即使不设置ai_flags为AI_PASSIVE,取出的地址也可以被绑定,很多程序中ai_flags直接设置为0,即3个标志位都不设置,这种情况下只要hostname和servname设置的没有问题就可以正确绑定。

(3)使用实例。

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

/* getaddrinfo.c */

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

int main()

{

struct addrinfo hints, *res = NULL;

int rc;

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("Host name is %s\n", res->ai_canonname);

}

exit(0);

}

10.2.3 socket基础编程

(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()所创建的等待队列中取出第一个未处理

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

网站地图

Top