TCP与UDP的区别

1、基于连接与无连接
2、对系统资源的要求(TCP较多,UDP少)
3、UDP程序结构较简单 流模式与数据报模式
4、TCP保证数据正确性,UDP可能丢包
5、TCP保证数据顺序,UDP不保证

具体编程时的区别

1、socket()的参数不同
2、UDP Server不需要调用listen和accept
3、 UDP收发数据用sendto/recvfrom函数 TCP:地址信息在connect/accept时确定
UDP:在sendto/recvfrom函数中每次均 需指定地址信息 UDP:shutdown函数无效

部分满足以下几点要求时,应该采用UDP 面向数据报方式

1、网络数据大多为短消息
2、拥有大量Client 对数据安全性无特殊要求
3、 网络负担非常重,但对响应速度要求高
4、UDP协议是不可靠的网络协议,它在通信两端各建立一个Socket,但是这两个Socket之间没有虚拟链路,这两个Socket只负责发送和接收数据报的对象!
例子:ICQ、ping

面向连接的TCP的流方式

服务器程序流程(多进程):

1、程序初始化
2、填写本机地址信息
3、绑定并监听一个固定的端口
4、收到Client的连接后建立一个socket连接 产生一个新的进程与Client进行通信和信息处理
5、子通信结束后中断与Client的连接

客户端程序流程:

1、程序初始化
2、填写服务器地址信息
3、 连接服务器
4、与服务器通信和信息处理
5、通信结束后断开连接

服务器代码

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define MYPORT 3490

#define BACKLOG 10

void main() {

int sockfd, new_fd;

struct sockaddr_in sa;   //本机地址

struct sockaddr_in their_addr;//远程地址

int sin_size;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {

perror("socket");

exit(1);

}

sa.sin_family = AF_INET;

sa.sin_port = htons(MYPORT);

sa.sin_addr.s_addr = INADDR_ANY;

bzero(&(sa.sin_zero), 8);

if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) == -1) {

perror("bind");

exit(1);

}

if (listen(sockfd, BACKLOG) == -1) {

perror("listen");

exit(1);

}

while(1) {

sin_size = sizeof(struct sockaddr_in);

new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))

if (new_fd == -1) {

perror("accept");

continue;

}

printf(”Got connection from %sn", inet_ntoa(their_addr.sin_addr));

if (fork() == 0) {

if (send(new_fd, "Hello, world! n", 14, 0) == -1)

perror("send");

close(new_fd);

exit(0);

}

close(new_fd);

while(waitpid(-1,NULL,WNOHANG) > 0);

}

}

客户端代码

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490

#define MAXDATASIZE 100

int main(int argc, char *argv[])

{

int sockfd, numbytes;

char buf[MAXDATASIZE];

struct hostent *he;

struct sockaddr_in their_addr;//服务器地址

if (argc != 2) {

fprintf(stderr,"usage: client hostnamen");

exit(1);

}

if ((he=gethostbyname(argv[1])) == NULL) {

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT);

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8);

if (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {

perror("connect");

exit(1);

}

if ((numbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1) {

perror("recv");

exit(1);

}

buf[numbytes] = '';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

服务器程序流程(单进程):

1、程序初始化
2、填写本机地址信息
3、绑定一个固定的端口
3、收到Client的数据报后进行处理与通信
4、通信结束后断开连接

客户端程序流程:

1、程序初始化
2、填写服务器地址信息
3、连接服务器 与服务器通信和信息处理 //发送报文的方式建立与服务器的联系
4、通信结束后断开连接

UDP方式下服务器与客户端程序差别不大,仅第三步不同。

服务器

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#include <sys/wait.h>

#define MYPORT 3490

void main()

{

int sockfd;

struct sockaddr_in my_addr;

struct sockaddr_in their_addr;

int sin_size, retval;

char buf[128];

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {

perror("socket");

exit(1);

}

my_addr.sin_family = AF_INET;

my_addr.sin_port = htons(MYPORT);

my_addr.sin_addr.s_addr = INADDR_ANY;

bzero(&(my_addr.sin_zero), 8);

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) == -1) {

perror("bind");

exit(1);

}

while(1) {

retval = recvfrom(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr, &sin_size);//获取远程主机的报文,并解析

printf("Received datagram from %sn",inet_ntoa(their_addr.sin_addr));

if (retval == 0) {

perror (“recvfrom");

close(sockfd);

break;

}

retval = sendto(sockfd, buf, 128, 0, (struct sockaddr *)&their_addr, sin_size);

}

}

客户端

#include <stdio.h>

#include <stdlib.h>

#include <errno.h>

#include <string.h>

#include <netdb.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <sys/socket.h>

#define PORT 3490

#define MAXDATASIZE 100

int main(int argc, char *argv[])

{

int sockfd, numbytes, sin_size;

char buf[MAXDATASIZE] = “Hello, world!”;

struct hostent *he; //

struct sockaddr_in their_addr;//服务器地址

if (argc != 2) {

fprintf(stderr,"usage: client hostnamen");

exit(1);

}

if ((he=gethostbyname(argv[1])) == NULL) {

herror("gethostbyname");

exit(1);

}

if ((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1) {

perror("socket");

exit(1);

}

their_addr.sin_family = AF_INET;

their_addr.sin_port = htons(PORT);

their_addr.sin_addr = *((struct in_addr *)he->h_addr);

bzero(&(their_addr.sin_zero), 8);

numbytes = sendto(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr,sizeof(their_addr));//向服务器发送任一报文

if (numbytes == -1) {

perror(“sendto");

exit(1);

}

printf(“Send: %s",buf);

numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0, (struct sockaddr *)&their_addr, &sin_size);

if (numbytes == -1) {

perror("recvfrom");

exit(1);

}

buf[numbytes] = '';

printf("Received: %s",buf);

close(sockfd);

return 0;

}

网络编程之 TCP / UDP 及其流程比较相关推荐

  1. Java网络编程之TCP、UDP

    Java网络编程之TCP.UDP 2014-11-25 15:23 513人阅读 评论(0) 收藏 举报 分类: java基础及多线程(28) 版权声明:本文为博主原创文章,未经博主允许不得转载. J ...

  2. 网络编程之TCP协议与UDP对比

    网络编程之TCP协议与UDP对比 UDP协议: 1,面向无连接. 2,不可靠协议,容易丢包. 3,速度快. 4,包体积有限制,64k以内. 通常,聊天,在线视频,凌波. TCP协议: 1.面向连接. ...

  3. Python中的网络编程之TCP

    Python中的网络编程之TCP 文章目录 Python中的网络编程之TCP 1.TCP介绍 2.TCP特点 3.TCP与UDP的不同点 4.tcp通信模型 5.tcp客户端 6.tcp服务器 7.T ...

  4. Centos网络编程之tcp十一种状态及问题处理办法

    尊重原创版权: https://www.noveljp.com/hot/43730.html 更多内容参考: https://www.noveljp.com/ Linux网络编程之tcp十一种状态及问 ...

  5. java 网络编程简单聊天_网络编程之 TCP 实现简单聊天

    网络编程之 TCP 实现简单聊天 客户端 1.连接服务器 Socket 2.发送消息 package lesson02;import java.io.IOException;import java.i ...

  6. java网络编程之TCP通讯

    java中的网络编程之TCP协议的详细介绍,以及如何使用,同时我在下面举2例说明如何搭配IO流进行操作, 1 /* 2 *TCP 3 *建立连接,形成传输数据的通道: 4 *在连接中进行大数据量传输: ...

  7. 网络编程之TCP客户端程序开发

    网络编程之TCP客户端程序开发 1. 开发 TCP 客户端程序开发步骤 2. socket 类的介绍 3. TCP 客户端程序开发示例代码 4. 小结 1. 开发 TCP 客户端程序开发步骤 创建客户 ...

  8. Linux网络编程之TCP状态转移

    Linux网络编程之TCP状态转移 一.TCP状态转移时序 二.半关闭及shutdown函数 一.TCP状态转移时序 TCP状态转移图: netstat -apn | grep client 查看客户 ...

  9. 网络编程之Tcp,udp

    1.TCP 2.补充异常处理 3.UDP 一TCP. 1.socket基础版本通讯 服务端: 1 import socket 2 3 server = socket.socket()# 生成一个对象 ...

最新文章

  1. 华三 交换 IRF V7
  2. STL源码剖析 lower_bound | upper_bound | binary_search
  3. http://ftp.gnu.org/gnu/ http://ftp.gnu.org/gnu/libc/
  4. 1. webpack 复制文件
  5. DeepLearning tutorial(6)易用的深度学习框架Keras简介
  6. C# List与Array性能比较
  7. 蓝宝石英语怎么读,sapphire是什么意思_sapphire的翻译_音标_读音_用法_例句_爱词霸在线词典...
  8. 超级详细:Docker Commands —— Container Commands !(新手必看必会)
  9. Jay Kreps: 为什么write有时候在Linux里面耗时很久
  10. 请查收一封来自程序员的情书
  11. 计算思维(Computational Thinking)
  12. 华为虚拟服务器密码忘记怎么办,手机云服务器密码忘记了
  13. OkHttp3基本使用
  14. matlab 股,用MATLAB构造股票过程
  15. 论文笔记(七):ROS Reality: A Virtual Reality Framework Using Consumer-Grade Hardware for ROS-Enabled Robot
  16. 计算机英语二考研用书,考研英语二怎么准备?记过来人详细经验
  17. 微服务学习——大厂面试题总结
  18. WEEK(8)作业——差分约束、拓扑排序(Kahn算法)、SCC(强连通分量)、DFS序、Kosaraju算法
  19. 电气工程cad实用教程电子版_建筑电气工程CAD实用教程
  20. 达芬奇官方的高配LINUX工作站指导,独家达芬奇调色工作站选购指南.doc

热门文章

  1. 【MySQL】(4)操作数据表中的记录
  2. 数据结构(复习)--------关于平衡二叉树(转载)
  3. 弹体飞行姿态仿真软件程序代写
  4. Afterthought 原来是这样的啊。。。。
  5. 夜深了,发点无聊的东西
  6. Java程序设计 图形用户界面 小巫版简易计算器
  7. vue-resource使用
  8. Vue — 第七天(vue-cli-案例)
  9. vue组件间函数调用
  10. 句子中单词首字母大写转换