C++网络Socket

【多机测试】
若没有多台电脑,可以使用虚拟机

有多台电脑,连接交换机

观察IP
ipconfig(Linux下是ifconfig)

检测连通性
ping

【发送接收缓冲区】

SendTo()

a)存入数据和发送数据存在时间差
b)如果存入数据太快,太多,则发送缓冲区会满

RecvFrom()

a)不论是否取,OS总是把数据收下存好
b)RecvFrom是从RecvBuf里取走现成的数据,如果不及时取,则缓冲区满。

缓冲区满的处理
发送数据(两种选择)
(1)直到缓冲区有剩余空间-阻塞
(2)新发送的数据没有存入缓冲区

接受数据(两种选择)
(1)新数据不被接受
(2)删除缓冲区已有数据,存放新的数据

丢包现象

设置发送/接受缓冲区的大小

if(1)
{
int bufsize=128*1024;
int ret=setsockopt(
	sock.hSock,
	SOL_SOCKET,
	SO_SNDBUF,//SO_RCVBUF
	(const char *)&bufsize,
	sizeof(int)
);
}

  

【丢包】
一般情况下设置缓冲区大小并不能解决丢包问题
(1)发送是否均匀
(2)接受是否及时
(3)数据带宽是否已经超过实际传输宽度

另外,即使HostA和HostB处理都没问题,网络上任意一个中间节点设备在转发该包时都有可能丢包。

结论:对UDP来说,丢包“家常便饭”,设计时考虑这一点

【网络字节序】
网络上的数据是一个字节一个字节地串行传输的
"hello"
h->68
e->65
l->6C
l->6C
o->6F

unsigned int a=0x12345678
它在内存的排列
78 56 34 12

规定
规定低字节在前,则称为小端
规定高字节在前,则称为大端

大端与小端是一套(硬件和软件),我们见到的主流都是小端
如intel/AMD,很少有大端系统

【网络传输时】
unsigned int a=0x12345678
如12 34 56 78(大端)
如78 56 34 12(小端)

惯例都是按大端传输
big-endian

一个int型数据占4个字节,下面按大端传输int型数据
【观察】

//HostA
#include<iostream>
using namespace std;

#include "afos/AfSocket.h"

void Endian_intToChar(int temp,char bytes[])
{
	bytes[0]=(char)(temp >> 24);
	bytes[1]=(char)(temp >> 16);
	bytes[2]=(char)(temp >> 8);
	bytes[3]=(char)(temp);
}

int main()
{
	//发送方
	AfSockAddr local("192.168.1.105",9000);//发送方地址
	AfUdpSocket soc;
	soc.Open(local,true);

	cout<<"发送方-端口9000 ->"<<endl;
	while (1)
	{
		cout<<"please push Enter!"<<endl;
		getchar();//每按一次回车...
		AfSockAddr peer("192.168.1.105",9001);
		char bytes[4];
		int temp=0x34560012;//int型数据的传输不再深究
		Endian_intToChar(temp,bytes);
		soc.SendTo(bytes,4,peer);
	}
	soc.Close();
	return 0;
}

  

//HostB
#include<iostream>
using namespace std;

#include "afos/AfSocket.h"

int Endian_CharToInt(char bytes[],int n)//四个字节char转为一个int型数据
{
	int temp=0;
	temp+=(bytes[0]<<24);
	temp+=(bytes[1]<<16);
	temp+=(bytes[2]<<8);
	temp+=(bytes[3]);
	return temp;
}

int main()
{
	//接受方
	AfSockAddr local("192.168.1.105",9001);//AfSockAddr local("192.168.1.104",9001);//接收方地址
	AfUdpSocket soc;
	soc.Open(local,true);

	cout<<"接收到-端口9001->"<<endl;
	char buffer[128];
	while (1)
	{
		AfSockAddr peer;
		int len=soc.RecvFrom(buffer,128,peer);
		buffer[len]=‘\0‘;
		if (len>0)
		{
			int temp;
			temp=Endian_CharToInt(buffer,len);
			printf("%08x\n",temp);
		}
		if (strcmp("quit",buffer)==0)
		{
			break;
		}
	}
	soc.Close();
	return 0;
}

  

【默认分配的端口号】
【端口的占用】
【多个发送方,一个接收方】
【阻塞与超时】

【1】默认分配的端口号
发送方可以不显示指定端口号
AfUdpSocket soc;
soc.Open();

可以查看自动分配的端口号
AfSockAddr local;
sock.GetLocalAddr(local);
unsigned int port=local.GetPort();
printf("local port:%d\n",port);

注意:在发送数据的时候,才会自动分配端口。

【2】端口的占用
当端口处于占用时,再创建一个Socket,还使用相同的端口,则创建失败,sock.Open()返回-1

一般设为可重用
sock.Open(local,true);//true允许重用,false不允许重用

【3】多个发送方,一个接收方

是谁发来的
string peer_ip=peer.GetIp_str();
int peer_port=peer.GetPort();
printf("from: IP->%s Port->%d",peer_ip.c_str(),peer_port);

【4】阻塞与超时

sock.RecvFrom()缓冲区无数据则等待,即阻塞,可设置最大时间
设置接收超时

sock.SetOpt_RecvTimeout(3000);//毫秒设置接收超时

AfUdpSocket soc;
soc.SetOpt_RecvTimeout(3000);//毫秒设置接收超时

int len=soc.RecvFrom(buffer,128,peer);

if (len<0)
{
printf("got %d\n",len);
}

非阻塞,定时查看(轮训),有数据返回0,无数据返回-1

时间: 2024-08-05 08:48:06

C++网络Socket的相关文章

linux网络socket 接口转

linux网络socket 接口 1.socket函数:一个进程必须做的第一件事就是调用socket函数获得一个文件描述符. ----------------------------------------------------------------- #include<sys/socket.h> int socket(int family,int type,int protocol); 返回:非负描述字---成功 -1---失败 -----------------------------

Java基础知识—网络Socket(六)

概述 网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net 包中提供了两种常见的网络协议的支持: TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信.通常用于互联网协议,被称 TCP / IP. UDP:UDP 是用户数据报协议的缩写,一个无连接的协议.提供了应用程序之间要发送的数据的数据包. Socket编程 套接字使用TCP提供了两台计算机之间的通信机制. 客户端程序创建一个套接字,并尝试连接服务器的套接字.当连接建立时,服务器

[网络] SOCKET, TCP/UDP, HTTP, FTP

(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传输层:TCP协议与UDP协议 应用层:FTP.HTTP.TELNET.SMTP.DNS等协议 HTTP是应用层协议,其传输都是被包装成TCP协议传输.能够用SOCKET实现HTTP. SOCKET是实现传输层协议的一种编程API,能够是TCP.也能够是UDP. (二)Socket连接与HTTP连接差

bbblack的网络socket通信实验

1. 本次用bbblack作网络的通信实验,对了,这个板子必须装SD卡才能启动吗?板载的4GB eMMC Flash 存储器,eMMC (Embedded Multi Media Card) 为MMC协会所订立的,eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD.TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格.eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,看下原理图,果然是SD卡的接口

网络Socket编程及实例

1 TCP和UDP介绍 在介绍TCP和UDP之前,有必要先介绍下网络体系结构的各个层次. 1.1  网络体系结构 协议:控制网络中信息的发送和接收.定义了通信实体之间交换报文的格式和次序,以及在报文传输或接收或其他事件所采取的动作. 一般把网络的层次结构和每层所使用协议的集合称为网络体系结构(NetworkArchitecture). 由国际标准化组织ISO 在1981年提出的网络分层结构,简称为OSI参考模型.(Open Systems Interconnection Reference Mo

JAVA I/O(四)网络Socket和ServerSocket

<Thinking in Enterprise Java>中第一章描述了用Socket和Channel的网络编程,核心即为Socket和Channel,本文简单讲述Socket的应用. Socket可以认为是两个互联机器终端应用软件的抽象,即对于一个网络连接,两端都有一个Socket,应用可以通过套接字进行交互通信. 在Java中,创建Socket连接另一台机器,可以从Socket中获取InputStream和OutputStream,将其作为输入输出流,使应用程序与操作本地文件IO类似.存在

java网络socket编程详解

7.2 面向套接字编程    我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的具体工作方式 7.2.1使用套接字实现基于TCP协议的服务器和客户机程序    依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下: 客户端: 1.用服务器的IP地址和端口号实例化Socket对象. 2.调用connect方法,连接到服务器上. 3.将发送到服务器的IO流填充到IO对象里,比如BufferedReader/PrintWriter

Java基础:网络+socket

一:名词解释 TCP:Transmission Control Protocol传输控制协议 IP:Internet Protocol因特网互联协议 HTTP:Hypertext transfer protocol超文本传输协议 FTP:File Transfer Protocol文本传输协议 SMTP:Simple Mail Transfer Protocol简单邮件传输协议 Telnet:远程登录服务 二:TCP/IP模型 三:通讯的基础 (1)IP地址来唯一标识计算机 (2)port端口号

PHP实现系统编程(一) --- 网络Socket及IO多路复用【网摘】

一直以来,PHP很少用于socket编程,毕竟是一门脚本语言,效率会成为很大的瓶颈,但是不能说PHP就无法用于socket编程,也不能说PHP的socket编程性能就有多么的低,例如知名的一款PHP socket框架 workerman 就是用纯PHP开发,并且号称拥有优秀的性能,所以在某些环境下,PHP socket编程或许也可一展身手. PHP提供了一系列类似C语言socket库中的方法供我们调用: [php] view plain copy socket_accept - Accepts