UDP(用户数据报协议)和套接字编程

这里写图片描述

  • 源端口:发送方的端口号(需要对方回信是选用,不用时可全为0)
  • 目的端口:终点交付报文时使用(把报文交给谁)
  • UDP长度:UDP用户数据报的长度,最小值8(仅有首部)
  • 校验和:检测UDP用户数据报在传输中是否有错

UDP
特点
  • 无连接的
  • 尽最大努力交付,即不保证可靠交付
  • 面向报文的
  • 没有拥塞控制
  • 支持一对一、一对多、多对多的交互通信
  • 首部开销小,只有8个字节
UDP套接字(不需要监听和连接)
//server
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>

void usage(const char* proc)
{
    printf("usage:%s [local_ip] [local_port]\n",proc);
}

int main(int argc,char*argv[])
{
    if(argc != 3)
    {
        usage(argv[0]);
        return 1;
    }

    int sk = socket(AF_INET,SOCK_DGRAM,0);
    if(sk < 0)
    {
        perror("socket");
        return 2;
    }

    struct sockaddr_in local;
    local.sin_family = PF_INET;
    local.sin_port = htons(atoi(argv[2]));
    local.sin_addr.s_addr =inet_addr(argv[1]);

    if(bind(sk,(struct sockaddr*)&local,sizeof(local))<0)
    {
        perror("bind");
        return 3;
    }

    while(1)
    {
        char buf[1024];
        struct sockaddr_in client;
        socklen_t len = sizeof(client);

        ssize_t s = recvfrom(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
        if(s > 0)
        {
            buf[s] = 0;
            printf("client# %s\n",buf);
            sendto(sk,buf,strlen(buf),0,(struct sockaddr*)&client,len);
        }
        else
        {
            close(sk);
            printf("client quit...\n");
            break;
        }
    }
    return 0;
}
//client
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>

void usage(const char* proc)
{
    printf("usage:%s [local_ip] [local_port]\n",proc);
}

int main(int argc,char*argv[])
{
    if(argc != 3)
    {
        usage(argv[0]);
        return 1;
    }
    int sk = socket(AF_INET,SOCK_DGRAM,0);
    if(sk < 0)
    {
        perror("socket");
        return 2;
    }

    char buf[1024];
    struct sockaddr_in server;
    server.sin_family = PF_INET;
    server.sin_port = htons(atoi(argv[2]));
    server.sin_addr.s_addr = inet_addr(argv[1]);

    socklen_t len = sizeof(server);

    while(1)
    {
        printf("Please Enter#:");
        fflush(stdout);

        ssize_t s = read(0,buf,sizeof(buf)-1);
        if(s > 0)
        {
            buf[s-1] = 0;
            sendto(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,len);

            s = recvfrom(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,&len);
            if(s>0)
            {
                buf[s] = 0;
                printf("server echo#: %s\n",buf);
            }
        }
    }
}
//makefile
.PHONY:all
all:udp_server udp_client
udp_client:udp_client.c
    gcc -o $@ $^
udp_server:udp_server.c
    gcc -o $@ $^ 
.PHONY:clean
clean:
    rm -f udp_server udp_client
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值