做微课常用的网站有哪些,国际贸易官方网站,室内设计软件自学,网站建设的文字用什么字体较好Socket 函数详细讲解和 C 示例 一、 Socket 基本概念1. Socket 简介2. Socket 编程步骤3. TCP Socket 编程示例服务器端客户端 4. 详细说明 二、 socket 函数1. domain 通讯的协议家族2. type 数据传输的类型3. protocol 最终使用的协议返回值示例 三、TCP 和 UDP的区别1. TCP 示例 一、 Socket 基本概念1. Socket 简介2. Socket 编程步骤3. TCP Socket 编程示例服务器端客户端 4. 详细说明 二、 socket 函数1. domain 通讯的协议家族2. type 数据传输的类型3. protocol 最终使用的协议返回值示例 三、TCP 和 UDP的区别1. TCP传输控制协议2. UDP用户数据报协议3. 总结示例应用 一、 Socket 基本概念
1. Socket 简介
Socket 是一种通信机制允许在不同主机之间或同一主机的不同进程之间进行数据交换。使用 socket 编程可以实现 TCP 和 UDP 协议的网络通信。
2. Socket 编程步骤
创建 Socket绑定仅服务器监听仅服务器接受连接仅服务器连接服务器仅客户端发送和接收数据关闭 Socket
3. TCP Socket 编程示例
服务器端
#include iostream
#include cstring
#include unistd.h
#include sys/types.h
#include sys/socket.h
#include netinet/in.h#define PORT 8080
#define BUFFER_SIZE 1024int main() {int server_fd, new_socket;struct sockaddr_in address;int addrlen sizeof(address);char buffer[BUFFER_SIZE] {0};// 创建 socket 文件描述符if ((server_fd socket(AF_INET, SOCK_STREAM, 0)) 0) {perror(socket failed);exit(EXIT_FAILURE);}// 绑定address.sin_family AF_INET;address.sin_addr.s_addr INADDR_ANY;address.sin_port htons(PORT);if (bind(server_fd, (struct sockaddr *)address, sizeof(address)) 0) {perror(bind failed);close(server_fd);exit(EXIT_FAILURE);}// 监听if (listen(server_fd, 3) 0) {perror(listen failed);close(server_fd);exit(EXIT_FAILURE);}// 接受连接if ((new_socket accept(server_fd, (struct sockaddr *)address, (socklen_t*)addrlen)) 0) {perror(accept failed);close(server_fd);exit(EXIT_FAILURE);}// 读取客户端发送的数据read(new_socket, buffer, BUFFER_SIZE);std::cout Message from client: buffer std::endl;// 发送数据给客户端const char *message Hello from server;send(new_socket, message, strlen(message), 0);std::cout Hello message sent\n;// 关闭 socketclose(new_socket);close(server_fd);return 0;
}客户端
#include iostream
#include cstring
#include unistd.h
#include arpa/inet.h#define PORT 8080
#define BUFFER_SIZE 1024int main() {int sock 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] {0};// 创建 socket 文件描述符if ((sock socket(AF_INET, SOCK_STREAM, 0)) 0) {std::cerr Socket creation error std::endl;return -1;}serv_addr.sin_family AF_INET;serv_addr.sin_port htons(PORT);// 将地址转换成二进制if (inet_pton(AF_INET, 127.0.0.1, serv_addr.sin_addr) 0) {std::cerr Invalid address/ Address not supported std::endl;return -1;}// 连接服务器if (connect(sock, (struct sockaddr *)serv_addr, sizeof(serv_addr)) 0) {std::cerr Connection Failed std::endl;return -1;}// 发送数据给服务器const char *message Hello from client;send(sock, message, strlen(message), 0);std::cout Hello message sent\n;// 读取服务器发送的数据read(sock, buffer, BUFFER_SIZE);std::cout Message from server: buffer std::endl;// 关闭 socketclose(sock);return 0;
}
4. 详细说明 创建 Socket socket(int domain, int type, int protocol) domain: 使用的协议族例如 AF_INET 表示 IPv4 网络协议。type: Socket 类型例如 SOCK_STREAM 表示面向连接的 TCP。protocol: 一般设置为 0让系统自动选择合适的协议。 绑定 bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 将 socket 绑定到特定的 IP 地址和端口号。 监听 listen(int sockfd, int backlog) 使 socket 处于监听状态准备接受连接。backlog 指定等待连接队列的最大长度。 接受连接 accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) 从监听队列中接受一个连接返回一个新的 socket 文件描述符用于与客户端通信。 连接服务器 connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 客户端使用这个函数连接到服务器。 发送和接收数据 send(int sockfd, const void *buf, size_t len, int flags)recv(int sockfd, void *buf, size_t len, int flags)read 和 write 也可以用于接收和发送数据。 关闭 Socket close(int sockfd) 关闭 socket 文件描述符。
二、 socket 函数
socket(int domain, int type, int protocol) domain: 使用的协议族例如 AF_INET 表示 IPv4 网络协议。type: Socket 类型例如 SOCK_STREAM 表示面向连接的 TCP。protocol: 一般设置为 0让系统自动选择合适的协议。
1. domain 通讯的协议家族
PF_INET IPv4互联网协议族。PF_INET6 IPv6互联网协议族。PF_LOCAL 本地通信的协议族。PF_PACKET 内核底层的协议族。PF_IPX IPX Novell协议族。
IPv6尚未普及其它的不常用。
2. type 数据传输的类型
SOCK_STREAM 面向连接的socket -----1数据不会丢失2数据的顺序不会错乱3双向通道。SOCK_DGRAM 无连接的socket -----1数据可能会丢失2数据的顺序可能会错乱3传输的效率更高。
3. protocol 最终使用的协议
protocol协议类型
通常为 0表示自动选择与指定域和类型匹配的协议。对于 AF_INET 和 SOCK_STREAM默认为 IPPROTO_TCP。对于 AF_INET 和 SOCK_DGRAM默认为 IPPROTO_UDP。
返回值
成功时返回一个新的套接字描述符。失败时返回 -1并设置 errno 以指示错误类型。
示例
int sockfd socket(AF_INET, SOCK_STREAM, 0);
if (sockfd -1) {perror(socket failed);exit(EXIT_FAILURE);
}在IPv4网络协议家族中数据传输方式为SOCK_STREAM的协议只有IPPROTO_TCP数据传输方式为SOCK_DGRAM的协议只有IPPROTO_UDP。
本参数也可以为0
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建tcp的sock
socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // 创建udp的sock三、TCP 和 UDP的区别
TCP传输控制协议和UDP用户数据报协议是两种主要的传输层协议用于网络通信。它们有各自的优缺点和适用场景。
1. TCP传输控制协议 连接导向 TCP是面向连接的协议在传输数据之前需要建立连接三次握手。连接建立后双方可以进行可靠的数据传输。 可靠性 提供可靠的数据传输确保数据包按顺序到达并且没有丢失或重复。使用确认机制、重传机制和校验和来保证数据的完整性和正确性。 流量控制 具有流量控制和拥塞控制机制防止网络拥塞和发送方发送速度过快。使用滑动窗口协议来管理流量控制。 传输速度 由于其可靠性和流量控制机制TCP的传输速度相对较慢但可靠性高。 头部开销 TCP头部较大通常为20字节不包括可选字段。 适用场景 适用于需要高可靠性的数据传输场景如网页浏览HTTP/HTTPS、文件传输FTP、电子邮件SMTP、远程登录SSH等。
2. UDP用户数据报协议 无连接 UDP是无连接的协议在传输数据之前不需要建立连接。数据包独立发送无需维护连接状态。 不可靠性 提供不可靠的数据传输不保证数据包的顺序、无丢失和无重复。发送数据后不确认是否到达目的地不重传丢失的数据包。 无流量控制 UDP没有流量控制和拥塞控制机制发送速度完全取决于应用程序。 传输速度 由于没有连接建立、流量控制和重传机制UDP的传输速度较快但可靠性低。 头部开销 UDP头部较小固定为8字节。 适用场景 适用于对传输速度要求高但对可靠性要求不高的场景如视频直播、在线游戏、实时语音通话VoIP、广播通信等。
3. 总结
特性TCPUDP连接性面向连接需要三次握手无连接可靠性可靠传输保证顺序和完整性不可靠传输不保证顺序和完整性流量控制有流量控制和拥塞控制无流量控制和拥塞控制传输速度较慢较快头部开销较大20字节不包括可选字段较小8字节适用场景需要高可靠性的应用需要高速度的应用
示例应用
TCPHTTP/HTTPS、FTP、SMTP、SSH、TelnetUDPDNS查询、DHCP、TFTP、在线游戏、视频流、实时音频
了解TCP和UDP的区别及其适用场景可以帮助开发人员在实际网络编程中选择合适的传输层协议以满足不同应用的需求。