10 套接字与网络函数
所有的 与网络相关的函数都来自tinyNET工程。
在调用任何与网络相关的函数(tnet_*)前你必须先调用tnet_startup().结束使用网络相关函数时应当调用tnet_cleanup()。
startup函数将会检测当前机器是不是小端存储模式。要想使用所有的网络相关函数,就必须加入头文件#include “tinynet.h”。
10.1 套接字
由于性能的原因,所有用tinyNET创建出的套接字都是默认非阻塞的。新创建的套接字将会自动绑定给定的IP和端口号,并用它来进行通信。
tnet_socket_create()是用来创建并且绑定一个非阻塞套接字的。使用tnet_socket_create_2() 函数可以控制套接字是否绑定。同样这个函数也可以强制在堆中创建一个阻塞套接字。
一个套接字对象是这样定义的:
typedef struct tnet_socket_s
{
TSK_DECLARE_OBJECT;
tnet_socket_type_t type;
tnet_fd_t fd;
tnet_ip_t ip;
uint16_t port;
tnet_tls_socket_handle_t* tlshandle;
}
tnet_socket_t;
创建一个套接字:
// (create udp ipv4 or ipv6 socket)
tnet_socket_t* socket = tnet_socket_create(
TNET_SOCKET_HOST_ANY, // local ip address/hostname to bind to
TNET_SOCKET_PORT_ANY, // local port number to bind to
tnet_socket_type_udp_ipv46 // the socket type (IPv4 or IPv6)
);
// TNET_SOCKET_HOST_ANY --> bind to "0.0.0.0" or "::"
// TNET_SOCKET_PORT_ANY --> bind to any available port
TNET_SOCKET_TYPE_IS_*宏用来决定:
- 套接字类型(流,报文)
- 套接字协议 (udp, tcp, tls, sctp, ipsec),
- IP版本 (ipv6, ipv4),
- …
套接字是一个定义好的对象,应该使用TSK_DECLARE_SAFE_FREE()宏对其进行销毁。套接字本身也将在被销毁时自动关闭。
10.2 传输
在传输层中,总是有一个主套接字来决定我们将以哪种方式进行传输(流,报文)。流式套接字能管理TCP,TLS 和SCTP几种套接字,而报文式套接字只能管理UDP套接字。两种传输方式都可以使用IPv4或者IPv6。