TCP/IP网络编程(二) 套接字协议及其数据传输特性

news/2024/5/17 17:39:14 标签: c++, 数据结构, 网络协议, tcp/ip, tcp

文章目录

    • 套接字协议及其数据传输特性
      • 关于协议
      • 创建套接字
      • 协议族
      • 套接字类型1:面向连接的套接字(SOCK_STREAM)
      • 套接字类型2:面向消息的套接字(SOCK_DGRAM)
      • 协议的最终选择
      • 面向连接的套接字:TCP套接字示例
      • 总结

套接字协议及其数据传输特性

关于协议

如果相隔比较远的两人进行通话,必须先决定通话方式,如果一方选择电话,另一方也必须选择电话,否则接受不到消息。

总之,协议就是为了完成数据交换而定好的约定。

创建套接字

#include <sys/socket.h>
int socket(int domain, int type, int protocol);

	- 成功返回文件描述符,失败返回-1
        domain		套接字中使用的协议族信息
        type		套接字数据传输类型信息
        protocol	计算机间通信中使用的协议信息

协议族

通过socket函数的第一个参数传递套接字中使用的协议分类信息,此协议分类信息成为协议族。

名称协议族
PF_INETIPv4互联网协议族
PF_INET6IPv6互联网协议族
PF_LOCAL本地通信的UNIX协议族
PF_PACKET底层套接字的协议族
PF_IPXIPX Novell协议族

套接字类型1:面向连接的套接字(SOCK_STREAM)

传输方式特征如下:

  • 传输过程中数据不会消失
  • 按序传输数据
  • 传输的数据不存在数据边界

收发数据的套接字内部有缓冲(buffer),就是字节数组。通过套接字传输的数据将保存到该数组,因此收到数据并不意味着马上调用read函数,只要不超过数组容量,有可能在数据填充缓冲后通过一次read函数调用读取全部,也有可能分成多次read函数调用进行读取。在面向连接的套接字中,read函数和write函数的调用次数并无太大意义,所以面向连接的套接字不存在数据边界。

概括面向连接的套接字如下: 可靠的、按序传递的、基于字节的面向连接的数据传输方式的套接字。

套接字类型2:面向消息的套接字(SOCK_DGRAM)

传输方式特征如下:

  • 强调快速传输而非传输顺序
  • 传输的数据可能丢失也夸你损毁
  • 传输的数据有数据边界
  • 限制每次传输的数据大小

概括面向消息的套接字如下: 不可靠、不按序传递的、以数据的高速传输为目的的套接字

协议的最终选择

前面已经通过socket函数的强两个参数传递了协议族信息和套接字数据传输方式,这些信息还不足以决定采用的协议,还需要传递第三个参数。

传递前两个参数即可创建所需套接字,所以大部分情况下可以向第三个参数传递0,除非遇到一下这种情况:

“同一协议族中存在多个数据传输方式相同的协议”

  • 如果是IPv4协议族面向连接的套接字第三个参数使用 IPPROTO_TCP

  • 如果是IPv4协议族面向消息的套接字第三个参数使用 IPPROTO_UDP

面向连接的套接字:TCP套接字示例

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

void error_handling(char *message);

int main(int argc, char* argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len=0;
	int idx=0, read_len=0;
	
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}
	
	sock=socket(PF_INET, SOCK_STREAM, 0);
	if(sock == -1)
		error_handling("socket() error");
	
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));
		
	if(connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) 
		error_handling("connect() error!");

	while(read_len=read(sock, &message[idx++], 1))
	{
		if(read_len==-1)
			error_handling("read() error!");
		
		str_len+=read_len;
	}

	printf("Message from server: %s \n", message);
	printf("Function read call count: %d \n", str_len);
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n', stderr);
	exit(1);
}

总结

这是《TCP/IP网络编程》专栏的第二篇文章,欢迎各位读者订阅!

更多资料点击 GitHub 欢迎各位读者去Star

⭐学术交流群Q 754410389 持续更新中~~~


http://www.niftyadmin.cn/n/4986177.html

相关文章

怎么清理c盘空间

 第一打开运行&#xff0c;输入%temp%点击确定&#xff0c;这都是缓存文件&#xff0c;全选后删除&#xff0c;回收站清空&#xff1b;第二运行中输入cleanmgr&#xff0c;进行扫描&#xff0c;选择临时文件和使用不到的文件&#xff0c;删除&#xff1b;第三使用安全卫士软件…

如何在WSL上导入任何Linux发行版

文章目录 一、准备1. 开启WSL相关功能2. 升级WSL3. 设置默认的wsl版本 二、通过 Microsoft Store 安装 Linux1. 查看 Microsoft Store 有哪些可安装的 Linux 发行版2. 安装 Linux 发行版3. 查看已安装的 Linux 发行版4. 启动Linux发行版 三、通过Linux发行商提供的tar文件安装1…

docker 本地镜像发布到私有库

1、下载镜像 Docker Registry docker pull registry 2、运行私有库Registry&#xff0c;相当于本地有个私有Docker hub 默认情况&#xff0c;仓库被创建在容器的/var/lib/registry目录下&#xff0c;建议自行用容器卷映射&#xff0c;方便于宿主机联调 docker run \ -d \ -p…

Sentinel —实时监控

Sentinel 提供对所有资源的实时监控。如果需要实时监控&#xff0c;客户端需引入以下依赖&#xff08;以 Maven 为例&#xff09;&#xff1a; <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artif…

SpringMVC使用

文章目录 一.MVC基础概念1.MVC定义2.SpringMVC和MVC的关系 二.SpringMVC的使用1.RequestMapping2.获取参数1.获取单个参数2.传递对象3.后端参数重命名&#xff08;后端参数映射&#xff09;4.获取URL中参数PathVariable5.上传文件RequestPart6.获取Cookie/Session/header 3.返回…

ARM DIY(五)摄像头调试

前言 今天&#xff0c;就着摄像头的调试&#xff0c;从嵌入式工程师的角度&#xff0c;介绍如何从无到有&#xff0c;一步一步地调出一款设备。 摄像头型号&#xff1a;OV2640 开发步骤 分为 2 个阶段 5 个步骤 阶段一&#xff1a; 设备树、驱动、硬件 阶段二&#xff1a; 应…

INDEMIND:“大+小”多机协同,实现机器人商用场景全覆盖

随着商用清洁机器人进入越来越多的场景中&#xff0c;单一的中型机器人并不能有效覆盖所有区域&#xff0c;更加细分化的产品组合正在成为新的趋势。 产品形态的“新趋势” 在商用场景中&#xff0c;目前的商用清洁机器人几乎均是中大型的产品形态&#xff0c;较大的体型意味…

【混合时变参数系统参数估计算法】使用范数总和正则化和期望最大化的混合时变参数系统参数估计算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…