数据报与流式套接字区别

流式套接字(TCP)是面向流的,也就是应用层看到的所有数据是一个流,没有消息保护边界,应用层并不能从这一整个流中区分出每一包数据。例如发送方发送了三次“hello!”,接收方在发送方发完三次数据后在进行读取,那么在接收方缓冲区足够大的情况下read一次会读出来”hello!hello!hello!“,即发送方发了三次数据,但是接收方一次就都接收了,接收方并不知道发送方是发送了三次数据,并且也不知道这三次分别发的什么。所以一般用tcp的话,需要应用层自己定义一套协议来划分出一个数据包的内容,例如加包头包尾标志,增加两字节的数据包长度等。
数据报套接字(UDP)是面向数据报的,有消息保护边界,因为有了消息保护边界,所以它并不把所有消息看成一个整体,而是可以根据保护边界划分出每一个包的内容,例如发送方发送了三次”hello!“,接收方在发送方发完三次数据后在进行读取,接收方并不会调用一次read就读出”hello!hello!hello!“,而是read三次,每次都读出”hello!“,说明数据报套接字是根据消息边界将单独的每一次数据返回给应用层。

tcp测试

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/un.h>

#define SA struct sockaddr
#define SEND_PATH "/tmp/d.udp" //运行一次程序要把这个文件删除在运行,否则bind失败
#define RECV_PATH "/tmp/s.udp" //运行一次程序要把这个文件删除在运行,否则bind失败

void sendmesg()
{
   
	char buf[128] = "hello!";
	struct sockaddr_un severAddr, clientAddr;
	
	int sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);
	if(sockfd < 0)
	{
   
		perror("socket");
		return;
	}

	bzero(&severAddr, sizeof(severAddr));
	severAddr.sun_family = AF_LOCAL;
	snprintf(severAddr.sun_path, sizeof(severAddr.sun_path), SEND_PATH);
	if(bind(sockfd, (SA*)&severAddr, sizeof(severAddr)) < 0)
	{
   
		perror("bind");
		return;
	}
	
	bzero(&clientAddr, sizeof(clientAddr));
	clientAddr.sun_family = AF_LOCAL;
	snprintf(clientAddr.sun_path, sizeof(clientAddr.sun_path), RECV_PATH);
	if(connect(sockfd, (SA
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值