您的位置:首页 > 文旅 > 美景 > 网络编程套接字

网络编程套接字

2024/10/6 14:34:58 来源:https://blog.csdn.net/weixin_55582891/article/details/140777852  浏览:    关键词:网络编程套接字

目录

预备知识

一.socket常见接口

1.1 socket

1.2 bind

1.2.1 sockaddr结构

1.2.2 sockaddr_in 结构

1.2.3 in_addr结构

1.3 listen

1.4 accept

1.5 connect

二. 数据接收与发送

2.1 send 和 sendto

2.2 recv 和 recvfrom


预备知识

  1. 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理
  2. ip地址是互联网协议地址,用于在网络中唯一标识设备。它类似于家庭地址,帮助数据在互联网中找到正确的目的地
  3. ucp协议UDP协议叫做用户数据报协议(User Datagram Pool),它无需建立连接,而且不可靠,面向数据报的传输层协议
  4. tcp协议:传输控制协议(Transmission Control Protocol),他是可连接,可靠,面向字节流的协议
  5. 网络字节序:网络当中传输的数据必须采用大端字节序(不管是大端机还是小端机器,在网络传输中,必须转化为大端存储方式传送)以下是转换函数

一.socket常见接口

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address, socklen_t address_len);// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address, socklen_t* address_len);// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

1.1 socket

socket 函数是网络编程中最基本的函数之一,用于 创建一个端点 (socket),它是进程间通信的 点对点连接 。以下是 socket 函数的详解:

          参数说明:        

  1. domain (int):

    • 指定通信协议的家族。最常见的是AF_INET(IPv4)和AF_INET6(IPv6)。
  2. type (int):

    • 指定socket的类型,决定了socket的使用方式。常见的类型有:
      • SOCK_STREAM:提供基于TCP的可靠连接。
      • SOCK_DGRAM:提供基于UDP的数据报服务。
      • SOCK_SEQPACKET:提供一个面向连接的、有序的、等长的包序列。
  3. protocol (int):

    • 指定使用的特定协议通常情况下,可以设置为0,表示让系统选择默认的协议。对于SOCK_STREAM,通常使用IPPROTO_TCP;对于SOCK_DGRAM,通常使用IPPROTO_UDP

         返回值:        

  • 成功时,函数返回新创建的socket的文件描述符。
  • 失败时,返回-1,并设置全局变量errno以指示错误类型。

1.2 bind

bind 函数在网络编程中用于将一个套接字(socket)与特定的网络地址和端口绑定在一起。以下是 bind 函数的详解:

          参数说明:        

  1. socket (int):

    • 要绑定的套接字的文件描述符,由 socket 函数创建。
  2. address (const struct sockaddr *):

    • 指向 sockaddr 结构的指针,包含了要绑定的网络地址信息。sockaddr 是一个通用结构,具体类型取决于地址族,例如 sockaddr_in 对于 IPv4,sockaddr_in6 对于 IPv6。
  3. address_len (socklen_t):

    • sockaddr 结构的大小,以字节为单位。这个参数是必须的,因为 sockaddr 结构是一个可变长度的结构。

         返回值:        

  • 成功时,函数返回0。
  • 失败时,返回-1,并设置全局变量 errno 以指示错误类型

         使用示例:        

struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 端口号
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意本地地址int result = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (result < 0) {// 错误处理
}

1.2.1 sockaddr结构

1.2.2 sockaddr_in 结构

虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主 要有三部分信息: 地址类型, 端口号, IP地址.

1.2.3 in_addr结构

in_addr用来表示一个IPv4的IP地址. 其实就是一个32位的整数

1.3 listen

listen 函数用于将一个套接字(socket)设置为监听状态,等待客户端的连接请求。这个函数通常在服务器端使用,用于接受客户端的连接请求。以下是 listen 函数的详解:

          参数说明:        

  1. socket (int):

    • 要监听的套接字的文件描述符。这个套接字必须是一个已经绑定到特定地址和端口的 TCP 套接字。
  2. backlog (int):

    • 指定未完成连接的最大队列长度。也就是说,可以有多少个客户端连接请求在排队等待被服务器接受。如果队列满了,新的连接请求将被拒绝。

         返回值:        

  • 成功时,函数返回0。
  • 失败时,返回-1,并设置全局变量 errno 以指示错误类型。

1.4 accept

accept 函数用于接受一个连接请求,通常在服务器端使用。当服务器端的套接字(socket)调用了 listen 函数并进入监听状态后,客户端的连接请求会被放入队列中。服务器端通过调用 accept 函数来从队列中取出一个连接请求,并建立一个连接

          参数说明:        

  1. socket (int):

    • 监听套接字的文件描述符。这个套接字必须已经调用过 listen 函数。
  2. *address (struct sockaddr)**:

    • 指向 sockaddr 结构的指针,用于存储连接请求的客户端的地址信息。如果不需要客户端地址信息,可以设置为 NULL。
  3. *address_len (socklen_t)**:

    • 指向 socklen_t 类型的指针,传入时指定 address 缓冲区的长度。函数返回时,实际使用的 address 缓冲区长度会被存储在这个变量中。

         返回值:        

  • 成功时,函数返回一个新的套接字文件描述符,这个新的套接字用于与客户端通信。
  • 失败时,返回-1,并设置全局变量 errno 以指示错误类型。

1.5 connect

connect 函数用于在客户端程序中建立一个到服务器的连接。它将一个套接字(socket)与服务器的地址和端口号关联起来,从而启动一个连接过程

          参数说明:        

  1. sockfd (int):

    • 客户端套接字的文件描述符。这个套接字必须已经通过 socket 函数创建,并且可以是阻塞或非阻塞的。
  2. addr (const struct sockaddr *):

    • 指向 sockaddr 结构的指针,包含了服务器的地址信息。这个结构的具体类型取决于使用的地址族(如 sockaddr_in 对于 IPv4,sockaddr_in6 对于 IPv6)。
  3. addrlen (socklen_t):

    • sockaddr 结构的大小,以字节为单位。这个参数是必须的,因为 sockaddr 结构是一个可变长度的结构。

         返回值:        

  • 成功时,函数返回0。
  • 失败时,返回-1,并设置全局变量 errno 以指示错误类型。

二. 数据接收与发送

2.1 send 和 sendto

send 函数用于向连接的套接字发送数据。通常用于TCP套接字

sendto 函数用于向指定地址发送数据,通常用于UDP套接字。

          send参数说明:        

  • sockfd (int): 套接字文件描述符。
  • buf (const void *): 指向要发送的数据的指针。
  • len (size_t): 要发送的数据长度。
  • flags (int): 指定发送操作的标志。通常设置为0。

          sendto参数说明:        

  • sockfd (int): 套接字文件描述符。
  • buf (const void *): 指向要发送的数据的指针。
  • len (size_t): 要发送的数据长度。
  • flags (int): 指定发送操作的标志。通常设置为0。
  • dest_addr (const struct sockaddr *): 指向目标地址的指针。
  • addrlen (socklen_t): 目标地址结构的大小。

         返回值:        

  • 成功时,返回发送的字节数。
  • 失败时,返回-1,

2.2 recv 和 recvfrom

recv 函数用于接收来自连接套接字的数据。通常用于TCP套接字。

recvfrom 函数用于接收来自指定地址的数据,通常用于UDP套接字。

         recv参数说明:        

  • sockfd (int): 套接字文件描述符。
  • buf (void *): 指向接收数据的缓冲区的指针。
  • len (size_t): 缓冲区的长度。
  • flags (int): 指定接收操作的标志。通常设置为0。

         recvfrom参数说明:        

  • sockfd (int): 套接字文件描述符。
  • buf (void *): 指向接收数据的缓冲区的指针。
  • len (size_t): 缓冲区的长度。
  • flags (int): 指定接收操作的标志。通常设置为0。
  • src_addr (struct sockaddr *): 指向存储源地址的指针。
  • addrlen (socklen_t *): 传入时指定源地址结构的大小,返回时实际使用的字节数。

         返回值:       

  • 成功时,返回接收的字节数。
  • 失败时,返回-1,并设置全局变量errno
  • 如果连接被对方关闭,返回0。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com