传输层上的socket

in cn •  10 months ago 

TCP上的socket

11111.jpg

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

2222.jpg

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那样建立连接。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!