QT网络编程【二】【Socket】
阅读原文时间:2023年07月08日阅读:1

1.QT中添加socket 库的相关操作

2.正常c++11 VS2019使用socket库的操作

3.winsock2 与 sys/socket.h的区别?

4.WinSock2 的基本操作?

详细步骤与实现源码参考1:[]:https://blog.csdn.net/jump0123/article/details/110237949

参考2:[]:https://www.jianshu.com/p/afb4237a5674

5.socket的创建

参数的说明[]:http://t.zoukankan.com/MyselfDancing-p-3660167.html

参数:

domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL等;

type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET等等;

protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等。当protocol为0时,会自动选择type类型对应的默认协议。

发现无论如何找都找不到这些这个库的源码

6.socket到底是什么?

参考网址[]:https://mp.weixin.qq.com/s/U7GR7hbUJBK_yzB4vaC6TQ

这个问题真的很让人困扰。

每个解释的博客或者是推文似乎都用着同一套让人完全听不懂的说辞。

直至找到这篇比较有头有尾的说明。

socket(套接字)就是把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

socket就是一组简单的接口,谁的接口? TCP/IP协议簇的接口。

不同进程间通信需要用到IPC,同一主机的还好说(用PID标识),不同主机的只能通过网络。TCP/IP 协议簇 完成了这项任务。网络层的ip协议能够确定主机地址,而传输层的协议加端口可以确定主机应用程序(进程)。 三元组(IP地址,协议,端口号)就能标识网络进程。socket起源于UNIX,“一切皆文件”的体现。

socket就是一类特殊的文件。操作模式就是open-read/write-close 。

7.winsock与socket的区别与联系?

对winsock的讲解更是抽象,只要提到winsock 百度上全是马上教你如何简易实现TCP、UDP的C/S模型 。

[]:https://mp.weixin.qq.com/s/-J3rDK_LbYXATQRSTzON9w

[]:https://wenku.baidu.com/view/f3d66cfe04a1b0717fd5dd3f.html 这个也不错

便于理解,这里是Linux的网络解读[]:https://developer.aliyun.com/article/801566

终于是有个比较听得懂的解说。

winsock就是微软用socket 开发的一个网络编程的相关函数,是Windows下的网络编程接口。

里面还有对具体代码的剖析(指winsock实现源码,而不是应用源码) 泪目

8.如何实现C/S?

在弄明白了6,7之后,我觉得变得开朗许多。

只需要掌握基本框架就行。C/S很好搭。

SOCKADDR_IN 具体有些什么

【百度百科有细节讲解】[]:https://baike.baidu.com/item/SOCKADDR_IN/3917215?fr=aladdin

sockaddr_in 首先得提到sockaddr

sockaddr 里的成员就是确定了套接字地址家族和协议家族

但是编程过程一般不对着sockaddr 进行操作(原因未知)而是用一个等价的数据结构进行操作:SOCKADDR_IN

在winsock2.h中是这么定义的

struct sockaddr_in {
        short   sin_family; ///*Address family一般来说AF_INET(地址族)PF_INET(协议族)*/
        u_short sin_port;/*Port number(必须要采用网络数据格式,普通数字可以用htons()函数转换成网络数据格式的数字)*/
        struct  in_addr sin_addr;/*IP address in network byte order(Internet address)*/
        char    sin_zero[8];/*Same size as struct sockaddr没有实际意义,只是为了 跟SOCKADDR结构在内存中对齐*/
};
//in_addr 又是什么呢?
typedef struct in_addr
{
    union{
            struct { unsigned char s_b1,s_b2,s_b3,s_b4; } S_un_b;
            struct { unsigned short s_w1,s_w2; } S_un_w;
            unsigned long S_addr;
    }S_un;
}in_addr;

10.INADDR_ANY指什么?

INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。

用于服务器端监听不确定的地址 而不是用于客户端

11.有几个转换函数得掌握

参考网址:[]https://blog.csdn.net/Lurora0/article/details/117413828

转换ip地址的有5个

inet_addr(); //功能是将一个点分十进制的IP转换成一个长整型数
//inet_addr方法可以转化字符串,主要用来将一个十进制的数转化为二进制的数,用途多于ipv4的IP转化。

参考网址[]:https://blog.csdn.net/myyllove/article/details/83380209

转换端口的函数有4种

参考网址讲得比较详细 包括说为什么需要这个函数的转换。

可以考虑自己实现其中一种函数就更能理解 与转换对象有关,而且还与工作机器的字节序有关。

12.有几个宏定义得掌握:

AF_INET

13.浅浅地发现一个bug

关于connect卡死的问题

[]:http://t.zoukankan.com/gjianw217-p-6297023.html