套接字类型和协议设置

TouchSocket|适配一个c++的Tcp自定义协议 然后再新建一个类,名为MyClientAdapter,继承CustomFixedHeaderDataHandlingAdapter,同时指定MyResponsePackage为泛型成员。该接口大概如下,其中Build方法,会指示成员应当如何构建数据。首先新建一个类,名为MyRequestPackage,同样继承MyBase,然后实现IFixedHeaderRequestInfo。此后,我们只需要发送MyRequestPackage对象,然后适配器内部会自动调用Build函数,然后执行发送。 阅读详情

创建套接字

成功返回文件描述符,失败返回-1
int socket (int __domain, int __type, int __protocol) ;

__domain:套接字中使用的协议族信息

一般使用PF_INET(IPv4互联网协议族),其它协议族不常使用或尚未普及。另外,套接字中实际采用的最终协信息是通过socket 函数的第三个参数传递的。在指定的协议族范围内通过第一个参数决定第三个参数。

在这里插入图片描述


__type:套接字数据传输类型

1.面向连接的套接字(SOCK_STREAM)

特点:
传输过程中数据不会丢失
按序传输数据,较晚传输的数据不会先到达
套接字连接必须一一对应,发送端和接收端各有一个套接字
传输的数据不存在边界
在这里插入图片描述

2.面向消息的套接字(SOCK_DGRAM)

在这里插入图片描述


__protocol:协议的最终选择

  传递前两个参数即可创建所需套接字。所以大部分情况下可以向第三个参数传递0,除非遇到以下这种情况:
         “同一协议族中存在多个数据传输方式相同的协议”
  数据传输方式相同,但协议不同。此时需要通过第三个参数具体指定协议信息。
  下面以前面讲解的内容为基础,构建向socket函数传递的参数。首先创建满足如下要求的套接字:
         “IPv4协议族中面向连接的套接字”
  IPv4与网络地址系统相关。参数PF_INET指IPv4网络协议族, SOCK_STREAM是面向连接的数据传输。满足这2个条件的协议只有IPPROTO_TCP,因此可以如下调用socket函数创建套接字,这种套接字称为TCP套接字。

int tcp_socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

  下面创建满足如下要求的套接字:
         “IPv4协议族中面向消息的套接字”
  SOCK_DGRAM指的是面向消息的数据传输方式,满足上述条件的协议只有IPPROTO_UDP。因此,可以如下调用socket函数创建套接字,这种套接字称为UDP套接字。

int udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

面向连接的套接字示例:

  验证TCP套接字的如下特性:
      “传输的数据不存在边界”
  为验证这一点,需要让write函数的调用次数不同于read函数的调用次数。因此,在服务端中分多次调用write函数发送数据,客户端调用一次read函数以接收服务器端发送的全部数据。

Windows平台客户端,client.cpp

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <winsock2.h>
#include <iostream>
#include <string>
#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")

using std::cout; using std::cerr; using std::endl; using std::string; using std::cin;

#define BUFFSIZE 2048
#define SERVER_IP  "127.0.0.1"  //"101.43.87.248"    // 指定服务端的IP
#define SERVER_PORT 9190            // 指定服务端的port


int main()
{

	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2,2),&wsaData) != 0)
		cout << "WSAStartup() error" << endl;

	SOCKET  hSocket = socket(PF_INET,SOCK_STREAM,0);
	if(hSocket == INVALID_SOCKET)
		cout << "socket() error" << endl;

	SOCKADDR_IN serv_addr;
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
	serv_addr.sin_port = htons(SERVER_PORT);

	//调用 connect 函数向服务器发送连接请求
	if (connect(hSocket, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
		cout << "connect() error" << endl;

	char message[30] = { 0 };
	if (int strLen = recv(hSocket, &message, 30, 0))
	{
		if (strLen == -1) 
		{
			cout << "recv() error" << endl;
		}
		else
		{
			message[strlen]=0;
			cout << message << endl;
		}
	}


	closesocket(hSocket);
	WSACleanup();
	cin.get();

	return 0;
}


Linux平台服务器端,server.cpp

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <sys/socket.h>
#include <sys/unistd.h>
#include <sys/types.h>
#include <sys/errno.h>
#include <netinet/in.h>
#include <iostream>
#include <string>


using std::cout; using std::cerr; using std::endl; using std::string; using std::cin;

#define DEFAULT_PORT 9190    // 指定端口为 9190
#define LOG_BUFFSIZE 65536

int main()
{

	//调用 socket 函数创建套接字, serv_sock用于存放套接字,即ip和端口
	int serv_sock = socket(PF_INET, SOCK_STREAM, 0);
	if (serv_sock == -1)
		cout << "Create socket error" << errno << ": " << strerror(errno) << endl;

	struct sockaddr_in serv_addr;
	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //0.0.0.0
	serv_addr.sin_port = htons(DEFAULT_PORT);

	//调用 bind 函数分配ip地址和端口号
	if (bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1)
		cout << "Bind error" << errno << ": " << strerror(errno) << endl;

	//调用 listen 函数将套接字转为可接受连接状态
	if (listen(serv_sock, 5) == -1)
		cout << "Listen error" << errno << ": " << strerror(errno) << endl;

	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size = sizeof(clnt_addr);
	//调用 accept 函数受理连接请求。如果在没有连接请求的情况下调用该函数,则不会返回,直到有连接请求为止

	int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);
	if (clnt_sock == -1)
		cout << "Accept error" << errno << ": " << strerror(errno) << endl;

	char message[] = "hello world";
	write(clnt_sock, message, sizeof(message));//1
	write(clnt_sock, message, sizeof(message));//2
	close(clnt_sock);
	close(serv_sock);


	return 0;
}
基于自定义协议的Socket编程 基于 自定义 协议的 Socket网络编程 立即下载

相关推荐

C实现基于Socket实现自定义协议通信

掌握C语言形式的Socket编程接又用法,能够正确发送和接收网络数据包; 分为客户端和服务端

一个简单的自定义通信协议(socket)

转自:http://vtrtbb.javaeye.com/blog/849336这是转自javaeye的一篇文章,作者是vtrtbb。按照网络通信的传统,我们都会自定义协议,这有很多好处,大家可以自己体会(嘿嘿)。一直不知道socket通信时候自定义数据包是什么样子的,偶然做了个小例子。先来说说数据包的定义,我这里是包头+内容 组成的:其中包头内容分为包类型+包长度, 那就是 消息对象=包类型+包长度+消息体包类型 byte 型包长度 int 型消息体 byte[]包总长度为 1 + 4 +  消息体.ge

懒人的技术笔记 6万+

R语言绘图进阶:五大工具高效组合多图(cowplot、patchwork、layout、par、gridExtra)

本文详细介绍了R语言中五大高效组合多图的工具:cowplot、patchwork、layout、par和gridExtra。针对不同场景提供了实用指南,帮助数据分析师解决图表排版难题,提升报告专业度。特别推荐cowplot用于ggplot2图形组合,patchwork提供最简洁语法,layout则支持完全自定义布局。

weixin_42544663的博客 288

自定义socket协议(服务端)

自定义协议服务//server.cpp:Definestheentrypointfortheconsoleapplication. // #include"stdafx.h" #include<windows.h> #include<stdio.h> #include<winsock2.h> #pragmaco...

weixin_34290390的博客 300

避开这些坑!DS18B20温度读取不准、时序混乱的5个常见问题与调试方法

本文深入解析DS18B20温度传感器在应用中常见的5个问题,包括温度读取不准、时序混乱等,并提供详细的调试方法。通过硬件设计优化、精准延时实现和数据解析技巧,帮助开发者有效解决温度值跳变、初始化失败等典型问题,提升OneWire协议下的温度测量精度。

weixin_29185493的博客 463

rk3588 rkaiq_3A_server 无法解析json文件记录

rk3588 rkaiq_3A_server 无法解析json文件记录

neardi_dev的博客 1万+

C++实现的Socket接口实现自定义协议通信

本文描述了一个基于TCP协议的客户端-服务器通信实验项目。实验要求两人小组分工开发,分别实现服务端和客户端程序。客户端采用多线程模式,提供7个功能选项(连接、断开、获取时间/名字/客户端列表、发送消息、退出),通过定义统一的数据包格式(包含目的ID、请求类型和消息内容)与服务器交互。服务器同样采用多线程处理并发连接,根据请求类型返回相应数据或转发消息。实验涉及socket编程、多线程通信、数据包格式设计等关键技术,最后要求使用Wireshark抓包验证功能实现。文中提供了核心数据结构和关键代码片段,展示了客

毕业作品网站 3452

ROS下UR+Realsense相机进行手眼标定

手眼标定主要是用来确定相机坐标系和机械臂坐标系之间的转换关系,从而实现后续的抓取等任务。

weixin_42157689的博客 7569

使用Socket构建TCP层,依据自定义协议的服务端

基于java.net中的Socket,构建TCP服务器,以及自定义的协议,完成数据接收和数据存储。

tianqiuhao的博客 408

CS5523实战:如何用国产芯片完美替代LT8911设计MIPI转eDP电路(附原理图)

本文详细介绍了使用国产芯片CS5523完美替代LT8911进行MIPI转eDP电路设计的实战经验。文章从芯片选型、核心特性对比入手,深入剖析了电源时钟设计、MIPI/eDP接口的PCB布局与信号完整性要点,并提供了完整的原理图参考和调试排错指南,为硬件工程师实现国产化替代提供了清晰可行的方案。

yhn4567890的博客 1139

【运筹学】什么是基变量?对于线性规划问题中“基”概念的理解(3月3日学习笔记)

在学习《线性规划与目标规划》的过程中,课程的主讲老师郭韧给出了对于基概念的定义如下图 图片来源:运筹学(中国大学mooc网) 由此我产生了几个疑惑:1.如何理解B是线性规划问题的一个基?2.为什么说最多有CnmC_n^mCnm​个基呢?     1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基?1.如何理解B是线性规划问题的一个基? 在回答第一个...

纸羊同学的博客 3万+

网络编程第二章总结(套接字类型和协议设置)

第二章、套接字类型和协议设置 2.1、套接字协议及其数据传输特性 2.1.1、关于协议 协议就是指为了完成数据交换而定好的约定。 2.1.2、创建套接字 创建套接字使用socket函数。 int socket(int domain, int type, int protocal); domain:套接字使用的协议族信息;type:套接字的数据传输类型;protocol:计算机通信过程中使用的协议信息。 2.1.3、常见的协议族 常见的协议族有5种,eg:PF_INET(ipv4);PF_INET6(ipv

i_actor的博客 263

抓包网络调试工具 reqable抓包教程

如果CA根证书未安装成功,网络图标是黄色,点击盾牌图标可以进入CA根证书安装界面,详细步骤请阅读。在API调试中,获取流量是第一步也是最基本的操作,这里讲解下如何使用Reqable获取流量,通俗地讲就是抓包。我们可以选择一个图片请求,双击打开详情面板,能够看到该请求的详细信息。如果系统代理未设置,网络图标是黄色,点击网络图标可以自动设置系统代理。此域名的结构树,可以查看该域名下所有请求的目录结构,点击选择可以查看该请求的详情。首先,需要启用Reqable的调试功能,点击最右上角的。打开浏览器,输入地址。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 2556

二 套接字类型和协议设置

** 第二章 套接字类型与协议设置 ======================================================================================================== 第二章主要内容: 主要讲解socket函数的各个参数的含义以及涉及到的套接字协议 #include <sys/socket.h> int socket(int domain, int type, int protocol) -> 成功时返回文件描述

weixin_48433164的博客 161

Oracle EBS PAC定期成本分配处理程序请求报错:30011一个无效帐户与正在处理的物料关联

Oracle EBS版本: RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 前提条件: 1、启用“MRP:调试模型”配置文件 月结会计反映执行《定期成本分配处理程序》请求报错: 中文:30011一个无效帐户与正在处理的物料关联。: CSTPALPC.create_dist_entry : 40 英文:30011An invalid account is associated with the item being transacted.:...

陈显平的专栏-Oracle EBS 1085

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《TCP/IP网络编程》笔记——第2章 套接字类型和协议设置

1、创建套接字 #include <sys/socket.h> int socket(int domain,int type,int protocol); domain:套接字中使用的协议族(protocol family)信息 type:套接字数据传输类型信息 protocol:计算机间通信中使用的协议信息 2、协议族 常用PF_INET,即ipv4 3、套接字类型 (1)面向连接的套接字(SOCK_STREAM) 特点: 传输过程中数据不会消失 按序传输数据 传输的数据不存

weixin_41646321的博客 2688

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

网络编程(一) 套接字类型和协议设置

1 协议:计算机间对话必备的通信规则 1.1 创建套接字:采用socket函数 #include<sys/socket.h> int socket(int domain,int type,int protocol); domain:套接字中使用的协议族信息、 type:套接字数据传输类型信息 protocol:计算机间通信中使用的协议信息 1.2 协议族(Protocol Family)domain PF_INET:IPv4互联网协议族 PF_INET6:IPv6互联网协议族 PF_LOC

zhaoyunye01的博客 442

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

socket()函数-关于套接字类型和协议设置winsock(自己记录使用)

这涉及到一个很重要的函数:int socket(int domain,int type,int protocol); domain:套接字中使用的协议族 type:套接字中数据传输类型; protocol:计算机通信使用的协议信息; 协议族(domain):简单讲只需要用到PF_INET(IPV4互联网协议簇),PF_INET6(IPV6协议簇);其他协议并不常用或尚未普及; 套接字类型:指的是套接字的传输方式 主要分为流式套接字(也称面向连接的套接字)(SOCK_STREAM)...

m0_53777765的博客 2111

day-02 套接字类型与协议设置、地址族和数据序列

一.套接字类型 二.地址信息的表示 三.网络字节序和地址变换 四.概念总结

Ricardo的博客 386

《TCP/IP网络编程》(第二章)套接字类型和协议设置

面向连接的套接字会根据接收端的状态传输数据,如果传输出错还会提供重传服务;如果接收端的套接字缓存被填满,传输段的套接字也会停止传输,直达接收端可以接受。因此,面向连接的套接字除非特殊情况,不会发生数据丢失。Windows系统创建套接字。

立志成为炼丹师? 340

网络编程——套接字类型与协议设置

参考 《TCP/IP网络编程》 尹圣雨 套接字类型与协议设置 创建套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol); 成功时返回文件描述符,失败时返回-1。domain:套接字中使用的协议族(Protocol Family)信息;type:套接字数据传输类型信息;protocol:计算机通信中使用的协议信息 协议族 头文件sys/socket.h中声明的协议族: PF_INET:IPv4

beilizhang的博客 729

网络编程之套接字

套接字是网络编程的基础,是网络上运行的程序之间进行数据交换的一种方式。它可以看作是一个端点,用于发送和接收数据,使得运行在不同机器上的应用程序能够交换信息,从而实现网络功能。套接字的概念最早由Unix系统的开发者引入,并逐渐成为网络编程中不可或缺的一部分。套接字主要由系统提供,用于网络通信的技术,它是基于TCP/IP协议的网络通信的基本操作单元。套接字工作在网络的传输层,它利用了TCP/IP协议族中的TCP或UDP协议来传送数据。

浩瀚之水的专栏 1523

Part 1 start network programming:chapter two:2.1 套接字协议及其数据传输

第二章:套接字类型与协议设置 内容概览 详细讲解socket函数的参数含义,以及涉及到的套接字协议 #include <sys/socket.h> int socket(int domain, int type, int protocol) -> 成功时返回文件描述符,失败是返回-1 参数说明: domain: 套接字中使用的协议族 (Protocol Family)信息 ...

chillinght的博客 259

创建套接字

socket()函数实现创建套接字的功能。当创建套接字时,需要向该函数传递“地址家族”、“套接字类型”和“协议类型”三个参数。Windows Socket定义AF_INET为IP地址家族,所以该函数的第一个参数必须为AF_INET。该程序用TCP协议打开套接字,所以设置第二个参数为SOCK_STREAM。第三个参数为协议类型,设置为IPPROTO_TCP。在第一个和第二个参数确定的情况下,第三个参

qq799238350的博客 1124

java创建原始套接字_原始套接字 IP_HDRINCL

原始套接字可以访问ICMP和ICMP等协议包,可以读写内核不处理的IP数据包。可以创建自定义的IP数据包首部。一句话,使用原始套接字可以编写基于IP协议的通讯程序。1.创建原始套接字具体格式如下:int sockfd;sockfd = socktet(AF_INET, SOCK_RAW, IPPROTO_ICMP);第一个参数:协议族 AF_INET 代表TCP/IP协议第二个参数:SOCKET类...

weixin_34526733的博客 619
上一篇: 地址族和数据序列
下一篇: TCP/IP协议
xiaobai_cpp
博客等级 码龄9年 264粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值