大家好,感谢邀请,今天来为大家分享一下深入理解Socket编程:实用学习指南的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
领域
域是通信地址的范围和类型。有以下几种经典类型:
UNIX IPV4 IPV6,对应的参数为AF_UNIX AF_INET AF_INET6。
域的参数均表示以AF开头的地址簇。以PF开头的代表协议族。最初的设计是地址簇和协议簇是多对多的,但在后来的实现过程中,协议簇和地址簇是一一对应的。所以基本上域指定了协议族,并且也指定了地址族。
类型
Socket表示是流还是数据包,实际上就是TCP或UDP。如果是TCP则为SOCK_STREAM,如果为UDP则为SOCK_DGRAM
bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
该调用用于将套接字绑定到地址。之后就可以发送TCP消息了,某些情况下也可以通过write发送UDP消息,但是只能在socket上读取对端socket数据。
套接字地址
该结构有一个表示地址类型的整数,后跟一个字符数组。后面可以看到,具体传入的数据结构是根据使用情况而定的,但是都是通用的。
listen(int sockfd, int backlog)
将套接字描述符标记为被动。可以通过socket主动连接。 backlog用于限制等待连接的数量。
accept(int sockfd, struct sockaddr *addr, socklen_t * addrlen);
Accept 调用阻塞并等待文件描述符sockfd 上的访问请求。一旦请求成功,就会创建一个新的socket,这个新的socket就会连接到对方。
地址
返回对方地址addrlen
传入的addr的长度用于告诉可以写入的输入的最大长度。
connect(int sockfd, const struct sockaddr * addr, socklen_t addrlen);
将sockfd连接到addr中指定的地址。
close(int fd)
用于关闭连接
read write
用于读入或读出sockfd
recvfrom(int sockfd, void *buffer, size_t length, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
sendto(int sockfd, const void *buffer, size_t length, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
用于发送和接收UDP 消息。服务器端不能使用listen函数和accept函数,客户端不能使用connect函数。
unix domain
使用上述API,可以实现通过本机上的文件进行通信。
unix域使用的sockaddr为sockaddr_run,如下图:
结构sockaddr_un{
sa_family_t sun_family;
字符sun_path[108];
}
网络字节序
网络字节顺序是基于big endian,而x86是little endian结构。使用以下函数执行转换
斯顿·托森托尔
h 是主机,n 是网络,s 是16 位,l 是32 位。 s 和l 是短的和长的,尽管这个标准不再使用。
Internet socket 地址结构
网络中使用的socket地址为sockaddr_in,定义如下
结构sockaddr_in{
sa_family_t sin_family;
in_port_t sin_port;
结构in_addr sin_addr;
无符号字符__pad[X];
可以看出不同的是后面的char数组变成了端口和地址。 Sin是socket Internet的缩写,缩写和sun一样糟糕。
Internet socket 地址转换
字符串地址格式与二进制地址格式转换API:
inet_pton(int domain, const char *src, void *addrptr);
该函数用于将src中包含的字符串转换为网络字节的二进制地址,并存储在addrptr中。 p 表示presentation,对人类来说是一个方便的地址。
const char * inet_ntop(int domain, const void *addrptr, char *dst_str, size_t len);
该函数将网络字节的二进制地址转换为人类可读的地址,并将其写入dst_str。缓冲区的大小在len 中传递。
getaddrinfo(const char *host, const char *service, const struct addrinfo *hints, struct **result);
该函数被赋予主机名和服务器名,并返回套接字地址和端口号。
getaddrinfo 将主机、服务和提示参数作为输入,其中主机参数包括主机名或IPV4 字符串。 service 是服务名称或端口号。调用该函数后,需要使用freeaddrinfo来释放空间。
getnameinfo(const struct sockaddr *addr, socklen_t addrlen, char *host, size_t hostlen, char *service, size_t servlen, int flags);
给定一个套接字地址结构,返回主机和服务器名称的字符串。
setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
sockfd 表示指向套接字的文件描述符。 level 参数指定套接字选项适用的协议。例如TCP 或IP,这表示该选项影响的套接字API 层。一般来说,这个选项会被设置为SOL_SOCKET,这意味着它作用于socket API层。参数optname代表我们期望设置的选项,optvalue用来设置刚才选项的值,可以是一个整数,也可以是一个结构体指针,指向一个缓冲区,参数optlen是该选项的大小刚才指针所指向的区域。
例如,设置sockfd的reuseaddr属性,可以这样调用:
int 重用=1;
if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, 重用, sizeof(重用))==-1)
{
关于深入理解Socket编程:实用学习指南的内容到此结束,希望对大家有所帮助。
【深入理解Socket编程:实用学习指南】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于开始学习socket了!打算自己实现一个简单聊天程序
有5位网友表示赞同!
感觉socket有点枯燥,希望笔记能讲明白一些关键点
有13位网友表示赞同!
我一直疑惑为什么要用socket网络通信,笔记里有没有比较直观解释?
有13位网友表示赞同!
想学多一点,知道哪些学习资源可以参考一下?
有18位网友表示赞同!
最近在做项目需要用到socket,这篇文章正好合适
有7位网友表示赞同!
之前对socket有点了解,希望能巩固巩固知识点
有8位网友表示赞同!
笔记讲了哪些socket的协议?Tcp还是Udp?
有14位网友表示赞同!
想学习一下客户端和服务端的连接机制
有16位网友表示赞同!
希望笔记能解释清楚一些Socket编程中的常见错误
有9位网友表示赞同!
感觉 Socket 的应用场景很多,很值得深入学习
有7位网友表示赞同!
要学好socket需要多实践吗?
有16位网友表示赞同!
这篇文章的笔记结构怎么样?方便吸收?
有10位网友表示赞同!
笔记里有没有一些具体的代码示例,方便理解?
有12位网友表示赞同!
我的网络编程基础比较弱,这个笔记适合我吗?
有14位网友表示赞同!
学习完socket之后能做什么呢?
有18位网友表示赞同!
Socket 可以实现哪些有趣的应用场景?
有16位网友表示赞同!
我觉得 socket 是一门很有用的技能
有13位网友表示赞同!
期待作者分享更多关于 Socket 的内容!
有6位网友表示赞同!
学习笔记很简洁,适合作为入门教材
有9位网友表示赞同!
这个socket学习笔记看起来非常实用
有16位网友表示赞同!