UDP通信的Connect分析

一, UDP是不可靠传输的

udp 要实现可靠传输 就要在上层应用层实现, TCP的滑动窗口的机制

udp实现滑动窗口

在服务器端 发送数据 会启动一个计时器 , 计时是否超出时间 , 超出就从新发送数据 这里有一个 延时 的情况是 怎么发生呢 是客户端接收到数据又从新把计时器置为0 这种情况会延时

二, udp中’握手’

在udp中要想找到服务器是否启动 或者 发送次数很多的时候可以 调用 connect 就是只连接一次服务器 ,

使用connect连接上服务器 , 类似tcp三次握手

这里写图片描述

不使用connect

#include "utils/network.h"


int main(int argc, char *argv[]) 
{
    int     sockfd, n;
    struct sockaddr_in servaddr;

    char sendline[MAXLINE], recvline[MAXLINE + 1];

    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, SERV_IP, &servaddr.sin_addr.s_addr);

    //创建socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    {
        err_sys("socket error");
        return -1;
    }

    while (Fgets(sendline, MAXLINE, stdin) > 0) 
    {
        Sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));

        if (Readable_timeo(sockfd, 5) == 0) {
            fprintf(stderr, "socket timeout\n");
            continue;
        }
        n = Recvfrom(sockfd, recvline, MAXLINE, 0, 0, 0);

        recvline[n] = 0;    /* null terminate */
        Fputs(recvline, stdout);
    }


    return 0;
}

使用connect连接

#include "utils/network.h"


int main(int argc, char *argv[]) 
{
    int     sockfd, n;
    struct sockaddr_in servaddr;

    char sendline[MAXLINE], recvline[MAXLINE + 1];

    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, SERV_IP, &servaddr.sin_addr.s_addr);

    //创建socket
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    {
        err_sys("socket error");
        return -1;
    }

    Connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

    while (Fgets(sendline, MAXLINE, stdin) > 0) 
    {
        Sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));

        if (Readable_timeo(sockfd, 5) == 0) {
            fprintf(stderr, "socket timeout\n");
            continue;
        }
        n = Recvfrom(sockfd, recvline, MAXLINE, 0, 0, 0);

        recvline[n] = 0;    /* null terminate */
        Fputs(recvline, stdout);
    }
    return 0;
}

源码的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值