UDP包头;UDP特点;TCP编程

UDP包头:传输信息时把包头和信息发过去(8个字节)
1.源端口号
2.目的端口号
3.长度
4.校验和


UDP特点:
    1.不安全不可靠的传输方式
    2.UDP资源开销小,实现机制简单 
    3.UDP是无连接的 

2.TCP编程
    发端:                 收端:
        socket           socket
                             bind    
                             listen
        connect         accept  
        send              recv
        recv              send 
        close             close   

    1.函数接口:
        1.socket 
        UDP: socket(AF_INET, SOCK_DGRAM, 0);
        TCP: socket(AF_INET, SOCK_STREAM, 0);

        2.listen 
        int listen(int sockfd, int backlog);
        功能:
            监听发送三次握手连接的套接字,并放入等到处理队列中
        参数:
            sockfd:套接字文件描述符
            backlog:等待队列的大小(最多存放尚未被处理的三次握手请求的个数)
        返回值:
            成功返回0 
            失败返回-1 
        
        3.accept 
          int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
          功能:
              处理等待队列中的第一个套接字
          参数:
              sockfd:套接字文件描述符 
              addr:存放发送方IP地址的空间首地址
              addrlen:存放发送方IP地址的空间大小
          返回值:
              成功返回一个新的文件描述符
              失败返回-1 

        4.connect 
          int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
          功能:
            向接收方发起连接请求
          参数:
            sockfd:套接字文件描述符
            addr:接收方的IP地址和端口号
            addrlen:接收方的IP地址和端口号的大小
          返回值:
            成功返回0 
            失败返回-1 
        
        5.send 
          ssize_t send(int sockfd, const void *buf, size_t len, int flags);
          功能:
            向接收方发送数据
          参数:
            sockfd:套接字文件描述符
            buf:要发送的数据的首地址 
            len:要发送的数据的长度
            flags:标志位 
          返回值:
            成功返回发送字节数
            失败返回-1 
        

#include "../head.h"

int main(void)
{
    int sockfd = 0;
    int ret = 0;
    struct sockaddr_in recvaddr;
    char tmpbuff[4096] = {0};
    ssize_t nsize = 0;

    recvaddr.sin_family = AF_INET;
    recvaddr.sin_port = htons(RECV_PORT);
    recvaddr.sin_addr.s_addr = inet_addr(RECV_IP);

    //1.创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sockfd)
    {
        perror("fail to socket");
        return -1;
    }

    //2.发送连接请求
    ret = connect(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
    if (-1 == ret)
    {
        perror("fail to connect");
        return -1;
    }

    printf("连接成功\n");

    //3.发送数据
    fgets(tmpbuff, sizeof(tmpbuff), stdin);
    tmpbuff[strlen(tmpbuff)-1] = '\0';
    nsize = send(sockfd, tmpbuff, strlen(tmpbuff), 0);
    if (-1 == nsize)
    {
        perror("fail to send");
        return -1;
    }

    printf("发送成功!\n");

    //4.接收数据
    memset(tmpbuff, 0, sizeof(tmpbuff));
    nsize = recv(sockfd, tmpbuff, sizeof(tmpbuff), 0);
    if (-1 == nsize)
    {
        perror("fail to recv");
        return -1;
    }

    printf("实际接收 %ld个字节, 内容:%s\n", nsize, tmpbuff);

    //5.关闭
    close(sockfd);

    return 0;
}


        6.recv 
          ssize_t recv(int sockfd, void *buf, size_t len, int flags);
          功能:
            接收发送方发送的数据
          参数:
            sockfd:套接字文件描述符
            buf:接收数据的缓冲区首地址
            len:接收数据的缓冲区的大小
            flags:标志位 
          返回值:
            成功返回实际接收字节数
            失败返回-1 
            对方关闭返回0 

#include "../head.h"

int main(void)
{
    int sockfd = 0;
    int confd = 0;
    int ret = 0;
    char tmpbuff[4096] = {0};
    struct sockaddr_in recvaddr;
    ssize_t nsize = 0;

    recvaddr.sin_family = AF_INET;
    recvaddr.sin_port = htons(RECV_PORT);
    recvaddr.sin_addr.s_addr = inet_addr(RECV_IP);
    
    //1.创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (-1 == sockfd)
    {
        perror("fail to socket");
        return -1;
    }

    //2.绑定IP地址和端口号
    ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
    if (-1 == ret)
    {
        perror("fail to bind");
        return -1;
    }

    //3.监听
    ret = listen(sockfd, 10);
    if (-1 == ret)
    {
        perror("fail to listen");
        return -1;
    }

    //4.处理连接请求
    confd = accept(sockfd, NULL, NULL);
    if (-1 == confd)
    {
        perror("fail to accept");
        return -1;
    }

    //5.收发
    nsize = recv(confd, tmpbuff, sizeof(tmpbuff), 0);
    if (-1 == nsize)
    {
        perror("fail to recv");
        return -1;
    }

    printf("RECV:%s\n", tmpbuff);

    memset(tmpbuff, 0, sizeof(tmpbuff));
    fgets(tmpbuff, sizeof(tmpbuff), stdin);
    tmpbuff[strlen(tmpbuff)-1] = '\0';

    nsize = send(confd, tmpbuff, strlen(tmpbuff), 0);
    if (-1 == nsize)
    {
        perror("fail to recv");
        return -1;
    }

    //6.关闭
    close(confd);
    close(sockfd);

    return 0;
}

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Netty是一种基于Java的网络通信框架,它提供了高度灵活和可扩展的功能,可以用于开发各种类型的网络应用程序。其中,Netty支持TCPUDP两种传输协议。 TCP(Transmission Control Protocol)是一种面向连接的协议,它能够提供可靠的数据传输。TCP通过三次握手建立连接,并通过流量控制和拥塞控制机制来保证数据的可靠性。在使用TCP协议时,数据的传输是一对一的,即每个数据包从发送方到接收方都会经过一个确定的路径。 UDP(User Datagram Protocol)是一种面向无连接的协议,它不保证数据的可靠传输。UDP在数据的发送方和接收方之间建立一个简单的交互,数据包通过广播方式发送,不保证数据包的顺序和完整性。UDP适用于实时性要求较高的应用场景,如音频、视频、游戏等。 在Netty中,无论是TCP还是UDP,都可以通过使用Channel来进行创建和管理。对于UDP来说,Netty提供了DatagramChannel来处理UDP数据包的发送和接收。而对于TCP来说,Netty提供了SocketChannel来处理TCP连接的建立和数据的传输。 Netty使用NIO(Non-blocking I/O)实现网络通信,通过事件驱动机制和高效的线程池来处理网络I/O操作。无论是TCP还是UDP,都可以通过设置相应的ChannelHandler来处理数据的编码、解码、读取和写入操作。 总之,Netty是一种强大的网络通信框架,支持TCPUDP两种传输协议。它提供了丰富的功能和简化的API,可以大大简化网络应用程序的开发和管理。无论是开发高性能服务器还是实时应用程序,Netty都是一个非常好的选择。 ### 回答2: Netty是一个开源的高性能网络应用框架,它支持多种协议,包括UDPTCPUDP(User Datagram Protocol)是一种无连接的传输协议,它在应用层和传输层之间提供了一种简单的、不可靠的传输服务。UDP主要用于传输实时数据,如音频和视频流等,因为它具有较低的延迟和较小的数据包头开销。UDP不保证数据的可靠传输,因此在使用UDP时需要自己处理丢包、乱序等问题。 而TCP(Transmission Control Protocol)是一种面向连接的传输协议,它提供了可靠的、有序的数据传输服务。TCP在应用层和传输层之间建立了一个可靠的、全双工的、面向字节流的连接。TCP通过序号、确认和重传机制等保证了数据的可靠性和有序性。TCP适用于传输对数据完整性要求较高的应用,如网页浏览、文件传输等。 Netty在UDPTCP协议之上提供了统一的编程模型和高度可配置的网络应用框架。它能够有效地处理网络传输中的各种问题,如拆包、粘包、流量控制等。通过使用Netty,开发者可以方便地实现各种基于UDPTCP网络应用,而无需关注底层网络细节。 总结来说,Netty是一个强大的网络应用框架,它支持UDPTCP等多种协议,并提供了统一的编程模型,使开发者能够更便捷地开发高性能的网络应用。无论是实时的UDP应用还是可靠的TCP应用,Netty都能提供高效、稳定的网络传输服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值