讯为4412开发板嵌入式学习(七)网络通信之TCP

传输控制协议(Transmission Control Protocol,TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。


一、服务端server

(一)、创建套接字

int socket(int domain, int type, int protocol);
参数说明:

  • domain:套接字(socket)通信作用域,具体选择见下表domain参数选择
  • type:socket通信语义,具体选择见下表type参数选择
  • protocol:指定了与套接字一起使用的特定协议。通常,在给定的协议族中只有一个协议支持特定的套接字类型,在这种情况下可以将协议指定为0。但是,可能存在许多协议,在这种情况下,必须以这种方式指定特定的协议(如ip、tcp、udp)。所使用的协议编号是特定于要进行通信的“通信域”的。

返回值:

  • 如果成功,将返回新套接字的文件描述符。如果出现错误,则返回-1,并相应地设置errno。

注意:domain和type需要搭配使用,并非都可一一对应。

domain参数选择

参数 作用 手册页
AF_UNIX, AF_LOCAL 本地通信 / Local communication unix(7)
AF_INET IPv4互联网协议 / IPv4 Internet protocols ip(7)
AF_INET6 IPv6互联网协议 / IPv6 Internet protocols ipv6(7)
AF_IPX IPX -Novell协议 / IPX - Novell protocols -
AF_NETLINK 内核用户接口设备 / Kernel user interface device netlink(7)
AF_X25 ITU-T X.25/ISO-8208协议 / ITU-T X.25/ISO-8208 protocol x25(7)
AF_AX25 业余无线电AX.25协议 / Amateur radio AX.25 protocol -
AF_ATMPVC 访问原始的ATM PVCs / Access to raw ATM PVCs -
AF_APPLETALK 可路由协议组 / Appletalk ddp(7)
AF_PACKET 低级信息包接口 / Low level packet interface packet(7)

type参数选择

参数 作用
SOCK_STREAM 提供有序、可靠、双向、基于连接的字节流。需要支持带外数据的传输机制。Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism may be supported.
SOCK_DGRAM 支持数据报(无连接、不可靠的固定最大长度的消息)。Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
SOCK_SEQPACKET 为最大长度固定的数据报提供有序、可靠、基于双向连接的数据传输路径。用户需要在每次输入系统调用时读取整个数据包。Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer is required to read an entire packet with each input system call.
SOCK_RAW 提供原始网络协议访问。Provides raw network protocol access.
SOCK_RDM 提供一个不确保排序的可靠数据报层。Provides a reliable datagram layer that does not guarantee ordering.
SOCK_PACKET 过时,已被淘汰,不应使用在程序中。Obsolete and should not be used in new programs; see packet(7).

(二)、设置服务端套接字的地址属性

套接字结构体,下面两个结构体本质上是相同的,但是结构体成员不同。设置时先对结构体sockaddr_in赋值,返回再将结构体转换为sockaddr

struct sockaddr_in {
   
   
  sa_family_t		sin_family;	/* Address family		地址族*/
  unsigned short		sin_port;	/* Port number			端口编号*/
  struct in_addr	sin_addr;	/* Internet address		互联网地址*/

  /* Pad to size of `struct sockaddr'. 没有实际作用,仅用于和结构体sockaddr字节对齐*/
  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
			sizeof(unsigned short int) - sizeof(struct in_addr)];
            /*
            __SOCK_SIZE__                   等于16 
            sizeof(short int)                 等于2
            sizeof(unsigned short int)    等于2
            sizeof(struct in_addr)          等于4
            上面这一句可写为 unsigned char sin_zero[8];
            */
};

struct sockaddr {
   
   
	sa_family_t	sa_family;	/* address family, AF_xxx	*/
	char		sa_data[14];	/* 14 bytes of protocol address	结构体sockaddr_in的字节对其就在这里得以体现了*/
};
1、sa_family

sa_family参数选择,需要根据所使用的传输协议或者上面创建套接字时选择的domain来选择。

/* Supported address families. */
#define AF_UNSPEC	0
#define AF_UNIX		1	/* Unix domain sockets 		*/
#define AF_LOCAL	1	/* POSIX name for AF_UNIX	*/
#define AF_INET		2	/* Internet IP Protocol 	*/
#define AF_AX25		3	/* Amateur Radio AX.25 		*/
#define AF_IPX		4	/* Novell IPX 			*/
#define AF_APPLETALK	5	/* AppleTalk DDP 		*/
#define AF_NETROM	6	/* Amateur Radio NET/ROM 	*/
#define AF_BRIDGE	7	/* Multiprotocol bridge 	*/
#define AF_ATMPVC	8	/* ATM PVCs			*/
#define AF_X25		9	/* Reserved for X.25 project 	*/
#define AF_INET6	10	/* IP version 6			*/
#define AF_ROSE		11	/* Amateur Radio X.25 PLP	*/
#define AF_DECnet	12	/* Reserved for DECnet project	*/
#define AF_NETBEUI	13	/* Reserved for 802.2LLC project*/
#define AF_SECURITY	14	/* Security callback pseudo AF */
#define AF_KEY		15      /* PF_KEY key management API */
#define AF_NETLINK	16
#define AF_ROUTE	AF_NETLINK /* Alias to emulate 4.4BSD */
#define AF_PACKET	17	/* Packet family		*/
#define AF_ASH		18	/* Ash				*/
#define AF_ECONET	19	/* Acorn Econet			*/
#define AF_ATMSVC	20	/* ATM SVCs			*/
#define AF_RDS		21	/* RDS sockets 			*/
#define AF_SNA		22	/* Linux SNA Project (nutters!) */
#define AF_IRDA		23	/* IRDA sockets			*/
#define AF_PPPOX	24	/* PPPoX sockets		*/
#define AF_WANPIPE	25	/* Wanpipe API Sockets */
#define
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值