线程与网络编程(第四节:缓冲区与按字节传递)
来源:互联网 发布:mac mini 电源线 编辑:程序博客网 时间:2024/06/06 08:46
1.发送接收缓冲区
一块内存:缓冲区
工作过程:发送方经过sendTo()发送到缓冲区,然后由操作系统自动取走,经网络传输存放到对方的缓冲区,然后经RecvFrom()取得内容。
由于存放数据与发送数据存在时间差,如果存的太多,可能会导致丢失;同理,接收时也类似。
可能的解决方案:设置大一点的缓冲区
具体代码:
发送方:
#include<stdio.h>#include "osapi/osapi.h"int main(){ //打开端口号 printf("发送方......\n"); OS_SockAddr local("127.0.0.1",9000); OS_UdpSocket sock; sock.Open(local,true); /* 加了一段内容,设置大一点的缓冲区,但不一定有效。 */ //open之后设置 if(1) { // 设置SendBuf的大小 int bufsize = 128*1024; // 128K int ret = setsockopt(sock.hSock,SOL_SOCKET, SO_SNDBUF, (const char*)&bufsize,sizeof(int)); if(ret < 0) { // 设置失败 printf("设置失败!\n"); } } while (1) { //让用户输入一段文本 char buf[128]; OS_SockAddr peer("127.0.0.1",9001); printf(">>"); gets(buf);//输入文字内容 int n=strlen(buf); sock.SendTo(buf,n,peer); //退出 if (strcmp(buf,"bye")==0) { break; } } sock.Close();//关闭端口号 return 0;}
接收方:
#include <stdio.h>#include "osapi/osapi.h"int main(){ printf("接收方....\n"); OS_SockAddr local("127.0.0.1",9001); OS_UdpSocket sock; sock.Open(local,true);//打开端口号 //设置接收方缓冲区 if(1) { // 设置RecvBuf的大小 int bufsize = 128*1024; // 128K int ret = setsockopt(sock.hSock,SOL_SOCKET, SO_RCVBUF,(const char*)&bufsize,sizeof(int)); if(ret < 0) { printf("设置失败......\n"); } } while (1) { char buf[128]; OS_SockAddr peer;//对端 //接收 int n=sock.RecvFrom(buf,128,peer); if (n<0) { break; } buf[n]=0; printf("接收内容:%s\n",buf); } sock.Close();}
扩大缓冲区这种并不一定能解决
使用Udp考虑的问题是:(1)发送是否均匀(2)接收是否及时(3)数据带宽是否超过实际带宽。
丢包不可避免,UDP适用于允许丢包的场景。
2.按字节传输
网络上的数据是按字节一个一个传递的。
网络字节传递:按大端方式传递
传送:
unsigned int a=0x12345678;unsigned char bytes[4];itob_32(a,bytes);//转成大端sock.sendTo(bytes,4,peer);
接收:
void print_bytes(void* buf, int n){ unsigned char* bytes = (unsigned char*) buf; for(int i=0; i<n; i++) { printf("%02X ", bytes[i]); if( (i+1)%16 == 0) printf("\n"); }}主函数中接收:printf("接收方....\n"); OS_SockAddr local("127.0.0.1",9001); OS_UdpSocket sock; sock.Open(local,true);//打开端口号 while (1) { unsigned char buf[128]; OS_SockAddr peer; // 对方的地址 int n = sock.RecvFrom(buf, 128, peer);//接收字节数 if(n <= 0) { break; } // 结束 // 按字节打印接收到的数据 printf("Got:"); print_bytes(buf,n); unsigned int a = btoi_32be(buf); printf("Got a number: %08X \n", a);
大端小端,需要根据具体传输时的需要来解决。网络传输时根据具体实际传。
0 0
- 线程与网络编程(第四节:缓冲区与按字节传递)
- 网络与线程编程(第七节:TCP与数据包)
- 结构与字节缓冲区互换
- 缓冲区溢出与字节对齐
- 网络编程中的主机字节序与网络字节序
- linux下网络编程(网络字节与主机字节)
- 网络编程中的主机字节序与网络字节序
- 网络编程中的网络字节序与主机字节序
- java 字节流与字符流的区别(缓冲区)
- 线程与网络编程(第六节:通信协议与TCP socket初识)
- 网络与线程编程(第八节:查询机制)
- 网络编程:Socket与JavaSE线程高级
- [java网络编程]线程与进程
- 网络编程与并发-线程、进程、协程
- 线程与消息传递
- 《UNIX网络编程 卷2》 笔记: 字节流与消息
- 网络图片查看器(子线程与消息传递)
- linux网络编程一:主机字节序与网络字节序的的判断
- 第15周实践项目-洗牌(2)
- JQuery插件小插曲
- 安卓6.0权限相关说明
- 将Map转换成Class
- FastDFS源码分析之tracker协议分析
- 线程与网络编程(第四节:缓冲区与按字节传递)
- CSS box-sizing属性
- Android学习笔记三之Android基础
- 大话设计模式-第07章 为别人做嫁衣--代理模式
- Add Two Numbers 将2个以链表形式表示的数相加
- Scanner & ASCII & split();
- intellij idea 2016破解方法
- Android ActionBar-左上角icon设置
- memcached源码阅读----使用libevent和多线程模型