c++实现TCP&UDP

做网络通信作业之前的学习  !(>。<)!

一.TCP

1.服务端流程

        1.创建socket套接字

                socket套接字可以理解成网络接口,只有通过了socket套接字才能跟对应的电脑进行通信

        2.给这个socket绑定一个端口号

                IP地址是指定电脑的 端口号是指定电脑上面某个软件的

        3.给socket开启监听属性

                这个socket只能用来接收连接 不能用来做通讯

        4.等待客户端连接

        5.开始通讯

        6.关闭连接

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")

int main()
{
	//windows上使用网络功能需要开始网络权限
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	//1.创建socket套接字
	/*socket(
		int af,  //协议地址簇 ipv4/ipv6 对应 AF_INET/AF_INET6
		int type,	//类型	流式协议/帧式协议 对应 SOCK_STREAM/SOCK_DGRAM
		int protocol	//保护协议 tcp/udp不用填保护协议 直接填0
	);*/

	//此处是服务端socket,所以我们一般起名叫监听socket
	SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);

	//SOCKET是一个无符号的长整型,就是一个整数,可以直接打印出来
	//未开启网络结果为-1 即无效的socket -> INVALID_SOCKET
	if (INVALID_SOCKET == listen_socket){
		printf("create listen socket failed !!! errocode: %d\n", GetLastError());
		return -1;
	}


	//2.给这个socket绑定一个端口号
	//struct sockaddr_in {
	//	ADDRESS_FAMILY sin_family;	//协议地址簇
	//	USHORT sin_port;	//端口号
	//	IN_ADDR sin_addr;	//IP地址
	//	CHAR sin_zero[8];	//保留字节 -> 协议升级会用
	//};
	
	//大小端问题:
	//	一个数字在计算机中存储以二进制存储,对端口来讲占两个字节
	//	编程中最小单位我们通常用字节来算,很少用位算
	//	存数据的时候会有先后的问题 8080 -> 1F90(大端序号,高位放前面【千百个十】)
	//	但是本地电脑的存储方式是以小端序存储的【个十百千】
	//unsigned short a = 8080;
	//unsigned short* p = &a;

	struct sockaddr_in local = { 0 };
	local.sin_family = AF_INET;
	local.sin_port = htons(8080);	//大小端问题 中间设备使用的是大端序

	//服务端 选项 网卡 127.0.0.1(本地环回)只接受哪个网卡的数据
	//一般写0.0.0.0 不管哪个数据库来 只要有我都接受
	
	//INADDR_ANY整数 占4个字节
	//local.sin_addr.s_addr = htonl(INADDR_ANY);

	//手动指定
	local.sin_addr.s_addr = inet_addr("0.0.0.0"); //字符串IP转换成整数IP
	
	//绑定 给上面定义的socket绑定我们指定的内容
	/*int bind(
		SOCKET s,	//对哪个socket进行绑定
		const struct sockaddr FAR * name,	//sockaddr的结构
		int namelen	//长度
	);  返回整数类型*/

	//为什么使用sockaddr结构而不是sockaddr_in结构?(两个结构体的大小一模一样)
	/*struct sockaddr {
		ADDRESS_FAMILY sa_family;
		CHAR sa_data[14];
	}   用这个方便扩展  通用的结构*/ 
	if (-1 == bind(listen_socket, (struct sockaddr*)&local, sizeof(local))) {
		printf("bind socket failed !!! errocode: %d\n", GetLastError());
		return -1;
	}


	//3.给socket开启监听属性
	/*int listen(
		SOCKET s,
		int backlog	//半连接队列长度
	);*/
	if (-1 == listen(listen_socket, 10)) {
		printf("start listen socket failed !!! errocode: %d\n", GetLastError());
		return -1;
	}
	//以上准备工作结束

	
	//4.等待客户端连接
	//返回的客户端socket才是跟客户端可以通讯的一个socket
	//listen_socket唯一的作用就是等待连接 最后返回一个socket出来
	
	//accept()是阻塞函数,等到有客户端连接进来就接受连接,然后染回,否则就阻塞
	/*SOCKET accept(
		SOCKET s,	//监听socket
		struct sockaddr * addr,	//客户端的IP地址和端口号
		int * addrlen	//结构的大小  为什么是指针 因为可填可不填 要填就要和上面的addr都填
	);*/

	//如果要跟多个客户端通讯 需

你可能感兴趣的:(c++实现TCP&UDP)