套接字socket实现UDP

来源:互联网 发布:看港澳台电视直播软件 编辑:程序博客网 时间:2024/04/29 20:00

      TCP/UDP都是运输层协议,他们之间的最大区别就是TCP是面向连接的可靠传输协议,而UDP是不可靠的。

UDP的主要特点:

1.UDP是无连接的,发送数据不需要建立连接,因此,减少了开销和发送数据之前的时延。
2.UDP使用最大努力交付,不保证可靠交付。
3.UDP是面向报文的,而TCP是面向字节流的。
4.UDP没有拥塞控制。
5.UDP支持一对一,一对多,多对一和多对多的交互通信。
6.UDP的首部开销小,只有8个字节。

UDP的首部格式

(1).源端口:源端口号,在需要对方回信时使用。不需要时可以全部设置为0.
(2).目的端口:目的端口号,在终点交付报文时必须要使用到。
(3).长度:UDP用户数据报的长度,最小值为8.
(4).检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。(在计算校验和的时候,要在UDP用户数据报之前增加12个字节的伪首部,伪首部不想上递交,也不向下传递。IP数据报的检验和值检验IP数据报的首部,但UDP的检验和把首部和数据部分一起都检验)。
需用函数:
recvfrom

返回值描述

sendto

返回值描述

代码实现:
server.c
/*************************************************************************> File Name: server.c> Author: ZX> Mail: 18829897183@163.com > Created Time: Fri 10 Mar 2017 09:26:04 PM PST ************************************************************************/#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>int main(int argc, char* argv[]){//printf("I am server!\n");if( argc != 3){printf("Usage: %s [local_ip] [local_port]",argv[0]);return 1;}int sock = socket(AF_INET, SOCK_DGRAM, 0);if(sock < 0){perror("socket");return 2;}//printf("sock = %d\n",sock);int opt = 1;setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));struct sockaddr_in local;local.sin_family = AF_INET;local.sin_addr.s_addr = inet_addr(argv[1]);local.sin_port = htons(atoi(argv[2]));//bindif(bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){perror("bind");return 3;}char buf[1024];int buflen = sizeof(buf);struct sockaddr_in peer;socklen_t len = sizeof(peer);while(1){ssize_t s = recvfrom(sock, buf, buflen, 0, (struct sockaddr*)&peer, &len);if(s < 0){perror("recvfrom");return 4;}else if(s == 0){printf("client is quit!\n");}else{printf("client# %s\n",buf);}}close(sock);return 0;}
client.c
/*************************************************************************> File Name: server.c> Author: ZX> Mail: 18829897183@163.com > Created Time: Fri 10 Mar 2017 09:26:04 PM PST ************************************************************************/#include<stdio.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>int main(int argc, char* argv[]){//printf("I am client!\n");if( argc != 3){printf("Usage: %s [server_ip] [server_port]",argv[0]);return 1;}int sock = socket(AF_INET, SOCK_DGRAM, 0);if(sock < 0){perror("socket");return 2;}char buf[1024];int buflen = sizeof(buf);struct sockaddr_in peer;peer.sin_family = AF_INET;peer.sin_addr.s_addr = inet_addr(argv[1]);peer.sin_port = htons(atoi(argv[2]));socklen_t len = sizeof(peer);while(1){printf("Please Enter# ");fflush(stdout);ssize_t _s = read(0, buf, sizeof(buf)-1);buf[_s-1] = 0;ssize_t s = sendto(sock, buf, buflen, 0, (struct sockaddr*)&peer, len);if(s < 0){perror("sendto");return 4;}//printf("server# %s\n", buf);}close(sock);return 0;}

Makefile
.PHONY:allall:server clientclient:client.cgcc -o $@ $^server:server.cgcc -o $@ $^.PHONY:cleanclean:rm -f server client

编译环境:Centos
编译语言:C语言



0 0
原创粉丝点击