TCP上的socket
tcp上的socket是4元组,一个具有本地意义的标识
- 4元组:(源IP,源Port,目标IP,目标Port)
- 唯一标识: 代表本地的一个会话(2个进程之间的会话关系)
作用:
a. 本地应用使用这个标识,与远程的应用进程进行通信
b. 不必再每一个报文的发送都指定4元组元素数据 (简化设计与实现,抽象对象)
c. 标识就类似于OS打开了一个文件,返回一个整数的文件句柄。对文件相关的API操作都通过这个抽象标识交互。
d. 便于管理和适当结耦通信对象设计
int main() {
int sockfd; // 存储socket文件描述符的变量
struct sockaddr_in serv_addr; // 用于指定服务器地址的socket地址结构体
// 创建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("Error creating socket");
exit(EXIT_FAILURE);
}
printf("Socket created successfully\n");
// 初始化sockaddr_in结构体
serv_addr.sin_family = AF_INET; // 使用IPv4地址
serv_addr.sin_port = htons(8080); // 指定端口号,使用网络字节序
// 将IP地址转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
// 连接到服务器
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
perror("Error connecting to the server");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Connected to the server\n");
// 这里可以发送和接收数据
// ...
// 关闭socket
close(sockfd);
printf("Socket closed\n");
return 0;
}
UDP上的socket
UDP 上的socket,表示两个进程之间通信无需建立连接,每个报文都是独立传输,前后报文可能给不同的分布式进程。
UDP对socket的标识,只能用一个整数表示本应用实体的标识;传输报文,必须提供接收方IP,Port
udp上的socket是2元组,一个具有本地意义的标识
- 2元组:IP,Port(源端指定)
- 指定上层应用所在的一个端节点(end point)
- 发送数据采用创建好的标识ID,无需每个报文指定源IP,Port
- 发送报文,必须指定对方ip和udp的port(另外一个端节点)
int main() {
int sockfd; // 存储socket文件描述符的变量
struct sockaddr_in serv_addr; // 用于指定服务器地址的socket地址结构体
char message[] = "Hello, UDP Server!"; // 要发送的消息
int n; // 发送的字节数
// 创建UDP socket
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("Error creating socket");
exit(EXIT_FAILURE);
}
printf("UDP Socket created successfully\n");
// 初始化sockaddr_in结构体
memset(&serv_addr, 0, sizeof(serv_addr)); // 清零结构体
serv_addr.sin_family = AF_INET; // 使用IPv4地址
serv_addr.sin_port = htons(12345); // 指定端口号,使用网络字节序
// 将IP地址转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr);
// 向服务器发送消息
n = sendto(sockfd, message, sizeof(message), 0, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (n < 0) {
perror("Error sending message");
close(sockfd);
exit(EXIT_FAILURE);
}
printf("Message sent successfully (%d bytes)\n", n);
// 关闭socket
close(sockfd);
printf("UDP Socket closed\n");
return 0;
}
这个示例代码假设有一个UDP服务器正在监听本地地址127.0.0.1上的端口12345。在实际使用中,你需要根据目标服务器的实际情况来修改IP地址和端口号。此外,UDP是一个无连接的协议,所以不需要像TCP那样建立连接。