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

来源:互联网 发布:adobe dw cc 2017 mac 编辑:程序博客网 时间:2024/05/16 08:05

这里写图片描述

  • 源端口:发送方的端口号(需要对方回信是选用,不用时可全为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:allall:udp_server udp_clientudp_client:udp_client.c    gcc -o $@ $^udp_server:udp_server.c    gcc -o $@ $^ .PHONY:cleanclean:    rm -f udp_server udp_client
原创粉丝点击