孙雨翔优秀作者
原创内容 来源:小居数码网 时间:2024-07-29 12:10:01 阅读() 收藏:59 分享:80 爆
导读:您正在阅读的是关于【数码知识】的问题,本文由科普作家协会,生活小能手,著名生活达人等整理监督编写。本文有2059个文字,大小约为8KB,预计阅读时间6分钟。
1、套接字基本知识套接字(socket)就是对网络当中不同主机上面的应用程序进程之间进行双向通信的端点的抽象。套接字类型:流式套接字、数据报套接字、原始套接字。套接字作用:主要完成两个应用程序之间的数据传输。套接字本质:两个网络各自通信连接中的端点。2、套接字表示方式套接字socket=(ip地址:端口号),套接字表示方法采用点分十进制的ip地址后面写上端口号,中间用冒号或逗号隔开。每个传输层连接唯一地被通信两的两个端点(两个套接字)所确定。比如IP地址是192.168.2.34,端口号是89,对应套接字就是(192.168.2.34:89)。3、socket在网络当中地位及作用socket在所有的网络操作系统中是必不可少,而且在所有的网络应用唾弃中也是必不可少。它是网络通信中应用程序对应的进程和网络协议之间的接口。具体套接字在网络系统中地位如下:
套接字地址族 说明
UNIX UNIX域套接字
INET 通过TCP/IP协议支持的Internet地址族
AX25 Amater radio X25
APPLETALK Appletalk DDP
IPX Novell IPX
X25 X25
Linux所支持的BSD套接字类型
流(stream):提供可靠的双向顺序数据流,可以保证数据不会在传输过程中丢失、破坏或重复出现。流套接字通过INET地址族的TCP协议实现。
数据报(datagram):提供双向的数据传输,但是并不对数据的传输过程中提供担保,意思是说,数据可能会以错误的顺序传递,甚至丢失或破坏。这种类型的套接字通过INET地址族的UDP协议实现。
原始(raw):利用这种类型的套接字,进程可以直接访问底层协议(称为原始)。 可靠发送的消息:和数据报套接字类似,但保证数据被正确传输到目的端。 顺序数据包:和流套接字类似,但数据包大小是固定的。
数据包(packet):并不是标准的BSD套接字类型,它是Linux专有的BSD套接字扩展,可允许进程直接在设备访问数据包。
// Internet地址族套接字操作集(一组协议操作例程)struct proto_ops {int family;struct module *owner;int (*release) (struct socket *sock);int (*bind) (struct socket *sock,struct sockaddr *myaddr,int sockaddr_len);int (*connect) (struct socket *sock,struct sockaddr *vaddr,int sockaddr_len, int flags);int (*socketpair)(struct socket *sock1,struct socket *sock2);int (*accept) (struct socket *sock,struct socket *newsock, int flags, bool kern);int (*getname) (struct socket *sock,struct sockaddr *addr,int peer);__poll_t (*poll) (struct file *file, struct socket *sock,struct poll_table_struct *wait);int (*ioctl) (struct socket *sock, unsigned int cmd,unsigned long arg);#ifdef CONFIG_COMPATint (*compat_ioctl) (struct socket *sock, unsigned int cmd,unsigned long arg);#endifint (*gettstamp) (struct socket *sock, void __user *userstamp,bool timeval, bool time32);int (*listen) (struct socket *sock, int len);int (*shutdown) (struct socket *sock, int flags);int (*setsockopt)(struct socket *sock, int level,int optname, char __user *optval, unsigned int optlen);int (*getsockopt)(struct socket *sock, int level,int optname, char __user *optval, int __user *optlen);#ifdef CONFIG_COMPATint (*compat_setsockopt)(struct socket *sock, int level,int optname, char __user *optval, unsigned int optlen);int (*compat_getsockopt)(struct socket *sock, int level,int optname, char __user *optval, int __user *optlen);#endifvoid (*show_fdinfo)(struct seq_file *m, struct socket *sock);int (*sendmsg) (struct socket *sock, struct msghdr *m,size_t total_len);/* Notes for implementing recvmsg:* ===============================* msg->msg_namelen should get updated by the recvmsg handlers* iff msg_name != NULL. It is by default 0 to prevent* returning uninitialized memory to user space. The recvfrom* handlers can assume that msg.msg_name is either NULL or has* a minimum size of sizeof(struct sockaddr_storage).*/int (*recvmsg) (struct socket *sock, struct msghdr *m,size_t total_len, int flags);int (*mmap) (struct file *file, struct socket *sock,struct vm_area_struct * vma);ssize_t (*sendpage) (struct socket *sock, struct page *page,int offset, size_t size, int flags);ssize_t (*splice_read)(struct socket *sock, loff_t *ppos,struct pipe_inode_info *pipe, size_t len, unsigned int flags);int (*set_peek_off)(struct sock *sk, int val);int (*peek_len)(struct socket *sock);/* The following functions are called internally by kernel with* sock lock already held.*/int (*read_sock)(struct sock *sk, read_descriptor_t *desc,sk_read_actor_t recv_actor);int (*sendpage_locked)(struct sock *sk, struct page *page,int offset, size_t size, int flags);int (*sendmsg_locked)(struct sock *sk, struct msghdr *msg,size_t size);int (*set_rcvlowat)(struct sock *sk, int val);};
上面就是小居数码小编今天给大家介绍的关于(linux内核socket编程)的全部内容,希望可以帮助到你,想了解更多关于数码知识的问题,欢迎关注我们,并收藏,转发,分享。
94%的朋友还想知道的:
(252)个朋友认为回复得到帮助。
部分文章信息来源于以及网友投稿,转载请说明出处。
本文标题:linuxsocket原理(linux内核socket编程):http://sjzlt.cn/shuma/152539.html