PPLP_DGK_util

1.connect_to_client:

socket()函数用法详解:创建套接字

socket()函数用法详解:创建套接字 (biancheng.net)

不管是 Windows 还是 Linux,都使用 socket() 函数来创建套接字。socket() 在两个平台下的参数是相同的,不同的是返回值。

Linux 中的一切都是文件,每个文件都有一个整数类型的文件描述符;socket 也是一个文件,也有文件描述符。使用 socket() 函数创建套接字以后,返回值就是一个 int 类型的文件描述符。

Windows 会区分 socket 和普通文件,它把 socket 当做一个网络连接来对待,调用 socket() 以后,返回值是 SOCKET 类型,用来表示一个套接字。

int socket(int af, int type, int protocol);

1) af 为地址族(Address Family),也就是 IP 地址类型,常用的有 AF_INET 和 AF_INET6。AF 是“Address Family”的简写,INET是“Inetnet”的简写。AF_INET 表示 IPv4 地址,例如 127.0.0.1;AF_INET6 表示 IPv6 地址,例如 1030::C9B4:FF12:48AA:1A2B。

记住127.0.0.1,它是一个特殊IP地址,表示本机地址 

你也可以使用 PF 前缀,PF 是“Protocol Family”的简写,它和 AF 是一样的。例如,PF_INET 等价于 AF_INET,PF_INET6 等价于 AF_INET6。

2) type 为数据传输方式/套接字类型,常用的有 SOCK_STREAM(流格式套接字/面向连接的套接字) 和 SOCK_DGRAM(数据报套接字/无连接的套接字),我们已经在《套接字有哪些类型》一节中进行了介绍。

3) protocol 表示传输协议,常用的有 IPPROTO_TCP 和 IPPTOTO_UDP,分别表示 TCP 传输协议和 UDP 传输协议。 

setsockopt 函数 (winsock.h) 

setsockopt 函数 (winsock.h) - Win32 apps | Microsoft Learn

该函数设置套接字选项 。

1)语法:

int setsockopt(
  [in] SOCKET     s,
  [in] int        level,
  [in] int        optname,
  [in] const char *optval,
  [in] int        optlen
);

2)参数:

[in] s

标识套接字的描述符。

[in] level

选项定义的级别 (例如,SOL_SOCKET) 。

[in] optname

要为其设置值的套接字选项 (,例如,SO_BROADCAST) 。 optname 参数必须是在指定级别内定义的套接字选项,或者行为未定义。

[in] optval

指向在其中指定所请求选项值的缓冲区的指针。

[in] optlen

optval 参数指向的缓冲区的大小(以字节为单位)。

3)返回值

如果未发生错误, 则 setsockopt 返回零。 否则,将返回SOCKET_ERROR值,并且可以通过调用 WSAGetLastError 来检索特定的错误代码。

错误代码含义

WSANOTINITIALISED

在使用此函数之前,必须执行成功的 WSAStartup 调用。

WSAENETDOWN

网络子系统失败。

WSAEFAULT

optval 参数指向的缓冲区不在进程地址空间的有效部分,或者 optlen 参数太小。

WSAEINPROGRESS

正在执行阻止的 Windows 套接字 1.1 调用,或者服务提供商仍在处理回调函数。

WSAEINVAL

级别参数无效,或者 optval 参数指向的缓冲区中的信息无效。

WSAENETRESET

设置SO_KEEPALIVE时,连接已超时。

WSAENOPROTOOPT

指定提供程序或套接字 (选项未知或不受支持,请参阅) SO_GROUP_PRIORITY限制。

WSAENOTCONN

设置SO_KEEPALIVE时,连接已重置。

WSAENOTSOCK

:描述符不是套接字。

perror()、errno 的使用

(45条消息) 【Socket网络编程】14. perror()、errno 的使用_Mister Zhu的博客-CSDN博客

perror ( )用 来 将 上 一 个函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。

sockaddr结构体

socket编程——sockaddr_in结构体操作 - 周人假的 - 博客园 (cnblogs.com)

sockaddr_in 结构体:struct sockaddr_in中的in 表示internet,就是网络地址,这只是我们比较常用的地址结构,属于AF_INET地址族,他非常的常用
sockaddr_in结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中

struct sockaddr_in { 
   short int sin_family;
   unsigned short int sin_port; 
     struct in_addr sin_addr;
struct in_addr { 
    unsigned long s_addr;
           }
                
     unsigned char sin_zero[8];
}   

sin_port和sin_addr都必须是NBO。一般可视化的数字都是HBO(本机字节顺序)

sin_zero 初始值应该使用函数 bzero() 来全部置零。一般采用下面语句:

        struct sockaddr_in cliaddr;
        bzero(&cliaddr,sizeof(cliaddr));

 网络字节顺序NBO(Network Byte Order)和主机字节顺序(HBO,Host Byte Order)转换:

(45条消息) 网络字节顺序NBO(Network Byte Order)和主机字节顺序(HBO,Host Byte Order)转换_lxj434368832的博客-CSDN博客

      htonl()--"Host to Network Long"
      ntohl()--"Network to Host Long"
      htons()--"Host to Network Short"
      ntohs()--"Network to Host Short"
sockaddr 和 sockaddr_in的相互关系:
一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数

  •     sockaddr_in用于socket定义和赋值
  •     sockaddr用于函数参数

 socket通信 bind() 函数详解 

(45条消息) socket通信 bind() 函数详解_socket.bind_行孤、的博客-CSDN博客

socket编程:listen()函数详解 

(45条消息) socket编程:listen()函数详解_socket listen_超级大洋葱806的博客-CSDN博客

socket编程 accept函数详解 

(45条消息) linux socket编程 accept函数详解_linux accept_handsome boy!的博客-CSDN博客

socket编程 close函数详解

(45条消息) linux socket编程 close函数详解_linux closesocket函数_handsome boy!的博客-CSDN博客

getnameinfo使用

(45条消息) getnameinfo使用_mayue_csdn的博客-CSDN博客

这个函数与getaddrinfo互补,它以一个套接口地址为参数,返回一个描述主机的字符串和一个描述服务的字符串。

inet_ntop函数 (ws2tcpip.h)

inet_ntop函数 (ws2tcpip.h) - Win32 apps | Microsoft Learn

InetNtop 函数将 IPv4 或 IPv6 Internet 网络地址转换为采用 Internet 标准格式的字符串

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值