套接字socket实现UDP
2017-03-11 22:26
232 查看
TCP/UDP都是运输层协议,他们之间的最大区别就是TCP是面向连接的可靠传输协议,而UDP是不可靠的。
2.UDP使用最大努力交付,不保证可靠交付。
3.UDP是面向报文的,而TCP是面向字节流的。
4.UDP没有拥塞控制。
5.UDP支持一对一,一对多,多对一和多对多的交互通信。
6.UDP的首部开销小,只有8个字节。
(2).目的端口:目的端口号,在终点交付报文时必须要使用到。
(3).长度:UDP用户数据报的长度,最小值为8.
(4).检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃。(在计算校验和的时候,要在UDP用户数据报之前增加12个字节的伪首部,伪首部不想上递交,也不向下传递。IP数据报的检验和值检验IP数据报的首部,但UDP的检验和把首部和数据部分一起都检验)。
需用函数:
recvfrom
返回值描述
sendto
返回值描述
代码实现:
server.c
Makefile
编译环境:Centos
编译语言:C语言
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])); //bind if(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:all all:server client client:client.c gcc -o $@ $^ server:server.c gcc -o $@ $^ .PHONY:clean clean: rm -f server client
编译环境:Centos
编译语言:C语言
相关文章推荐
- 通过套接字(socket)和UDP协议实现网络通信
- 通过套接字(socket)和UDP协议实现网络通信
- 网络编程----socketserver多并发实现、FTP上传多并发、udp协议套接字多并发
- 使用DatagramSocket发送、接收数据(Socket之UDP套接字)
- UNIX环境高级编程学习之第十六章网络IPC:套接字 - 简单UDP Socket 通信
- 基于 TCP (面向连接)和无连接UDP协议的 socket 套接字编程
- Java 实现Socket,和UDP连接的一个样例
- Linux TCP/IP协议栈之Socket的实现分析(UDP篇)
- Socket UDP 简单聊天的实现
- python实现socket通讯(UDP)
- python实现socket通讯(UDP)
- 运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
- 用Socket API实现UDP
- 利用TCP和UDP协议,实现基于Socket的小聊天程序
- Linux TCP/IP协议栈之Socket的实现分析 第一部份 Socket套接字的创建 (-)
- TCP/UDP Socket编程 C/C++实现(Windows Platform SDK)
- Socket API实现UDP广播
- UDP Socket编程 C/C++实现 (Windows Platform SDK)
- Java 利用套接字Socket实现简单的服务器与客户端通信
- 通过Socket套接字实现对计算机的远程监控