TCP socket VS domain socket
TCP socket VS domain socket
1.异同点:
1.1 类型和地址:
- TCP Socket:
- 类型: 面向连接的套接字,提供可靠的、基于流的通信。
- 地址: 使用IP地址和端口号。
- Unix Domain Socket:
- 类型: 也是面向连接的套接字,但在本地计算机上进行通信。
- 地址: 使用文件路径作为地址。
1.2. 通信范围:
- TCP Socket:
- 范围: 适用于网络通信,可以跨越不同计算机。
- Unix Domain Socket:
- 范围: 适用于本地通信,仅限于同一台计算机内的进程之间。
1.3. 传输速度:
- TCP Socket:
- 速度: 传输速度相对较慢,因为它提供可靠的、面向连接的通信,会有额外的开销用于数据包的确认和重传。
- Unix Domain Socket:
- 速度: 通常比TCP Socket快,因为它在本地计算机上进行通信,不涉及网络协议的开销。
1.4. 可靠性:
- TCP Socket:
- 可靠性: 提供可靠的、面向连接的通信,确保数据的有序性、完整性、不重复性。
- Unix Domain Socket:
- 可靠性: 同样提供可靠的通信,但在本地通信环境中可能会更加可靠。
5. 适用场景:
- TCP Socket:
- 适用场景: 用于需要可靠通信的网络应用,如文件传输、Web服务器等。
- Unix Domain Socket:
- 适用场景: 适用于本地进程间通信,例如同一台计算机上的各个服务之间的通信。
2.优缺点:
TCP Socket:
- 优点:
- 提供可靠的、面向连接的通信。
- 跨越网络,适用于分布式系统。
- 缺点:
- 传输速度相对较慢,有一定的开销。
- 需要IP地址和端口,不适用于本地通信。
Unix Domain Socket:
- 优点:
- 本地通信速度较快,不涉及网络协议的开销。
- 不需要IP地址和端口,使用文件路径作为地址。
- 缺点:
- 仅限于本地通信,无法跨越不同计算机。
- 在网络通信方面不如TCP Socket可靠。
3.使用方式
在Linux上创建TCP Socket和Unix Domain Socket(也称为Domain Socket)涉及到使用socket系统调用和相关的网络编程库。以下是对这两者的创建过程的详细介绍:
3.1创建TCP Socket:
在Linux中创建TCP Socket的一般步骤如下:
-
包含头文件: 在你的C程序中,首先需要包含一些头文件,其中包括
<sys/socket.h>
和<netinet/in.h>
。#include <sys/socket.h> #include <netinet/in.h>
-
创建Socket: 使用socket系统调用创建一个套接字。
int server_socket = socket(AF_INET, SOCK_STREAM, 0);
这里,
AF_INET
表示使用IPv4地址,SOCK_STREAM
表示创建一个面向连接的TCP Socket。 -
配置Socket地址结构: 设置服务器地址和端口等信息。
struct sockaddr_in server_address; server_address.sin_family = AF_INET; server_address.sin_port = htons(8080); // 选择一个合适的端口 server_address.sin_addr.s_addr = INADDR_ANY;
-
绑定Socket: 将套接字绑定到指定的地址和端口。
bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address));
-
监听连接: 开始监听连接请求。
listen(server_socket, 5); // 允许最大连接数为5
-
接受连接: 当有客户端连接请求时,使用
accept
函数接受连接。int client_socket = accept(server_socket, NULL, NULL);
client_socket
就是与客户端通信的套接字。
3.2 创建Unix Domain Socket:
Unix Domain Socket是在本地计算机上进行通信的一种方式。以下是创建Unix Domain Socket的步骤:
-
包含头文件: 在你的C程序中,首先需要包含
<sys/socket.h>
和<sys/un.h>
头文件。#include <sys/socket.h> #include <sys/un.h>
-
创建Socket: 使用socket系统调用创建Unix Domain Socket。
int server_socket = socket(AF_UNIX, SOCK_STREAM, 0);
这里,
AF_UNIX
表示使用Unix域地址,SOCK_STREAM
表示创建一个面向连接的Socket。 -
配置Socket地址结构: 设置Unix Domain Socket的路径。
struct sockaddr_un server_address; server_address.sun_family = AF_UNIX; strcpy(server_address.sun_path, "/tmp/my_socket");
这里
/tmp/my_socket
是Unix Domain Socket的路径。 -
绑定Socket: 将套接字绑定到指定的地址。c听连接:** 开始监听连接请求。
listen(server_socket, 5); // 允许最大连接数为5
-
接受连接: 当有客户端连接请求时,使用
accept
函数接受连接。int client_socket = accept(server_socket, NULL, NULL);
client_socket
就是与客户端通信的套接字。
这两种套接字的创建过程基本上是类似的,主要区别在于地址结构的设置和socket类型的选择。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!