TCP/UDP通信解疑
一、TCP是面向流的通信,这个什么意思呢,你read一下,可能从流的任何一点拿数据;然后呢,你需要对应用层的数据做封包处理。
封包可以使用数据类型和数据长度,或者使用某些字符串隔离包,可能是\n,说到这里,为何http请求没有指明数据长度呢,以前http通信是短连接只有一问一答,因此不需要数据长度;
后来http1.1出现keep-alive的长连接,但是它有诸如content-length等的报文头,而且http具有明确的开始点。
二、UDP是面向数据报的通信,它的使用简单,但有其最大报文不能超过64k,否则send失败;包之间具有明确界限,每次recv都会读取一个包,假设应用给
的buffer不够它本身的长度,其余部分也被抛弃。
以下是linux gcc 4.84的验证:
#include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <errno.h>void client_p() {sleep(1);//can use semphorestruct sockaddr_in addr;int sock;if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0){perror("client socket error");return NULL;}addr.sin_family = AF_INET;addr.sin_port = htons(8765);addr.sin_addr.s_addr = inet_addr("127.0.0.1");char buff[10];int n = 0;int len = sizeof(addr);do{n = sendto(sock, "123456789", 10, 0, (struct sockaddr*)&addr, sizeof(sockaddr));if (n < 0){perror("sendto server 1 error");break;}n = recvfrom(sock, buff, 10, 0, (struct sockaddr*)&addr, &len);//ifn = sendto(sock, "987654321", 10, 0, (struct sockaddr*)&addr, sizeof(sockaddr));//if} while (0);close(sock);return NULL; } void server_p() {struct sockaddr_in addr;int sock;if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0){perror("server socket error");return NULL;}addr.sin_family = AF_INET;addr.sin_port = htons(8765);addr.sin_addr.s_addr = inet_addr("127.0.0.1");char buff[10];int n = 0;int len = sizeof(addr);do{if (bind(sock, (struct sockaddr*)&addr, len) < 0){perror("bind error");break;}n = recvfrom(sock, buff, 4, 0, (struct sockaddr*)&addr, &len);if (n < 0){perror("recvfrom client 1 error");break;}else {printf("recv 1:%s\n", buff);//buff is a string }n = sendto(sock, "1", 1, 0, (struct sockaddr*)&addr, sizeof(sockaddr));//if (n < 0)n = recvfrom(sock, buff, 4, 0, (struct sockaddr*)&addr, &len);if (n < 0){perror("recvfrom client 2 error");break;}else{printf("recv 2:%s\n", buff);//buff is a string }} while (0);close(sock);return NULL; } int main(int argc, char**argv) {int ret = 0;pthread_t client, server;ret = pthread_create(&server, NULL, (void*)server_p, NULL);//ifret = pthread_create(&client, NULL, (void*)client_p, NULL);//if pthread_join(server);pthread_join(client);return 0; }
View Code
输出结果是:
1234
9876
转载于:https://www.cnblogs.com/green-crosswalk/p/8620275.html
TCP/UDP通信解疑相关推荐
- 高性能 TCP UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信
如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...
- QT TCP/UDP通信
参考:43黑马QT笔记之Qt下Tcp/Udp通信过程_Mango酱的博客-CSDN博客 HTTP与TCP的区别和联系_satellite13的博客-CSDN博客 TCP和UDP的区别: UDP通信 服 ...
- 【.NET类库】通过SharpSocket进行TCP/UDP通信数据传输
类库作用: 用于基于TCP/UDP协议的数据通信,调用简单,高效. 封装了和业务无关的底层细节,让开发人员可以专注于做业务 完善的示例代码: 针对类库的几种用法,都提供了较为详细的示例代码 一.TCP ...
- java安卓模拟器和电脑通信_PC电脑和Android模拟器访问及模拟器之间tcp/udp通信
Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统.要想实现PC电脑和Android模拟器系统以及Android模拟器之间 ...
- Android开发使用ServerSocket ServerSocketChannel DatagramSocket进行TCP UDP通信 实现服务器与APP消息推送
前言 在日常开发中采用Http协议进行数据传输的情况非常多,但这都是APP主动请求服务端,将数据传到服务器或者从服务器下载数据:那么如果我们想服务器主动联系我们或者我们频繁的上报消息给服务器,怎么弄呢 ...
- android模拟tcp接口转发,PC电脑和Android模拟器访问及模拟器之间tcp/udp通信
一. Android系统为实现通信将PC电脑IP设置为10.0.2.2,自身为10.0.2.15/127.0.0.1.然而PC电脑并没有为Android模拟器系统指定IP,所以PC只能通过端口重定向来 ...
- 黑马程序员_Java学习日记第八天--TCP/UDP通信、正则表达式
------- android培训. java培训.期待与您交流! ---------- UDP/TCP 如何实现通信: 1,找到对方IP 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序, ...
- iOS TCP UDP通信
转自:https://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/NetworkingTo ...
最新文章
- 软件工程与软件测试基础知识_这是我在软件工程工作九个月中学到的知识
- CS本科毕业生能拿到45万年薪?
- NLP界的「MVP」再次夺冠,刷新GLUE榜单
- phpcmsv9多表联合查询分页功能实现
- 数据挖掘导论读书笔记7 Apriori算法
- 前端学习之JavaScript第二天学习
- 迁移学习训练集准确率一直上不去_可以提高你的图像识别模型准确率的7个技巧...
- linux密码过期不修改,Linux解决用户密码过期但不用修改密码的方法
- SQL 的 left join 和 right join
- mac下更新自带的PHP版本到5.6
- android 自动打印出来,Android:签名打包后关闭Log打印
- 两幅图的RGB+Depth点云拼接
- 用计算机运算符编写检索式,检索式
- 人工智能算法(一)进化算法
- 【C语言】给出三角形三边长,求三角形面积
- .net 网站接入支付宝扫码支付
- 用串口(TFTP)给设备升级程序
- tunel凋亡试剂盒说明书_急求!!罗氏TUNEL试剂盒( In Situ Cell Death Detection Kit, TMR red )中文说明书或者操作步骤,急急急!!谢谢啦!...
- Wireshark对ping报文的解码显示(BE与LE) 转自作者:易隐者
- 在线升级R语言版本以及在RStudio容纳最新版本的R
热门文章
- 深圳先进院研究生计算机专业,2020年中科院深圳先进技术研究院全日制硕士研究生统考专业说明...
- gradle对java插件的扩展_Gradle之java插件入门
- hbase插入数据语句_记一次 spark thriftserver 插入数据到hbase 的异常
- pytorch nn.ReLU
- werkzeug serving.run_simple
- opencv-api moments
- 支付业务与技术架构学习总结(6)——对账系统的设计
- Jquery学习总结(6)——JQuery万能代码段
- linux挂载磁盘没有权限,linux肿么知道哪个盘没有被挂载
- oracle复杂分组查询语句,oracle中的“复杂”分组统计sql