嵌入式Linux网络编程之:网络基础编程
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()所创建的等待队列中取出第一个未处理
嵌入式Linux 网络编程 SOCKET 操作系统 相关文章:
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:实验内容——NTP协议实现(08-13)