深入理解Socket编程:实用学习指南

更新:11-07 民间故事 我要投稿 纠错 投诉

大家好,感谢邀请,今天来为大家分享一下深入理解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了!打算自己实现一个简单聊天程序

    有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位网友表示赞同!

【深入理解Socket编程:实用学习指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:【已解决】CocoaPods仓库`xxxxx`在`../../../../../.cocoapods/repos/xxxx`下的不整洁问题 下一篇:人生唯一无法带走的是你自身