UDP协议

栏目: 服务器 · 发布时间: 6年前

内容简介:UDP协议分为首部字段和数据字段,其中首部字段只占用8个字节,分别是个占用两个字节的源端口、目的端口、长度和检验和。具体协议字段信息如下:一个简单的例子:

UDP协议介绍

UDP协议分为首部字段和数据字段,其中首部字段只占用8个字节,分别是个占用两个字节的源端口、目的端口、长度和检验和。具体协议字段信息如下:

UDP协议

  • 长度:UDP报文的整个大小,最小为8个字节(仅为首部)
  • 检验和:在进行检验和计算时,会添加一个伪首部一起进行运算。伪首部(占用12个字节)为:4个字节的源IP地址、4个字节的目的IP地址、1个字节的0、一个字节的数字17、以及占用2个字节UDP长度。这个伪首部不是报文的真正首部,只是引入为了计算校验和。相对于IP协议的只计算首部,UDP检验和会把首部和数据一起进行校验。接收端进行的校验和与UDP报文中的校验和相与,如果无差错应该全为1。如果有误,则将报文丢弃或者发给应用层、并附上差错警告。

UDP实现

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • dest_addr : 是接收端的IP地址和端口信息;
  • src_addr : 是发送端的IP地址和端口信息;

一个简单的例子:

udp_client.c

#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define BUF_SIZE 1024


int main(int argc, char *argv[])
{
    struct addrinfo hint, *result;
    int res, sfd;
    char buf[BUF_SIZE];
    
    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sfd == -1) 
    {
        perror("socket error!\n");
        exit(1);
    }

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(struct sockaddr_in));

    unsigned short port = 8080;

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr("192.168.100.168");

    if (connect(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) != 0)
    {
        perror("connect error");
    exit(1);
    }

    snprintf(buf, BUF_SIZE, "hello server, now i will send data to you");
    if(send(sfd, buf, strlen(buf), 0) <= 0)
    {
        perror("send failed.");
    exit(1);
    }
    
    printf("send data to clint: %s\n", buf);
    
    memset(buf, 0, sizeof(buf));

    res = recv(sfd, buf, BUF_SIZE, 0);   
    printf("recved %d bytes from server.\n", res);
    printf("reveive data from server : %s. \n", buf);
    
    return 0;
}

udp_server.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>


#define BUF_SIZE 1024


int main(int argc, char *argv[])
{
    struct addrinfo hint, *result;
    struct sockaddr_in client_addr;
    int res, sfd, client_addr_len;
    char buf[BUF_SIZE];
    
    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(struct sockaddr_in));

    unsigned short port = 8080;

    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = INADDR_ANY;

    sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sfd == -1) 
    {
        perror("socket error!\n");
        exit(1);
    }
    
    res = bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));
    if (res == -1) 
    {
        perror("bind error!\n");
        exit(1);
    }
    
    while (1) 
    {
        printf("waiting for client ...\n");
        
        res = recv(sfd, buf, BUF_SIZE, 0);
        if (res == -1) 
    {
            perror("recvfrom error\n");
            exit(1);
        }
        printf("revceived data : %s\n", buf);
           
        snprintf(buf, BUF_SIZE, "hello client! Total reveive : %d.", res);
//        res = sendto(sfd, buf, strlen(buf), 0, (struct sockaddr*)&client_addr, client_addr_len);
        res = send(sfd, buf, strlen(buf), 0);
    if (res != strlen(buf) ) 
    {
            perror("sendto error\n");
            exit(1);
        }
        
        printf("send %d bytes to peer", res);

        printf("send data < %s > to client\n\n", buf);
    }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

代码阅读方法与实践

代码阅读方法与实践

斯平内利斯 / 赵学良 / 清华大学出版社 / 2004-03-01 / 45.00元

代码阅读有自身的一套技能,重要的是能够确定什么时候使用哪项技术。本书中,作者使用600多个现实的例子,向读者展示如何区分好的(和坏的)代码,如何阅读,应该注意什么,以及如何使用这些知识改进自己的代码。养成阅读高品质代码的习惯,可以提高编写代码的能力。 阅读代码是程序员的基本技能,同时也是软件开发、维护、演进、审查和重用过程中不可或缺的组成部分。本书首次将阅读代码作为一项独立课题......一起来看看 《代码阅读方法与实践》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具