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);
大端小端,需要根据具体传输时的需要来解决。网络传输时根据具体实际传。