TCP协议传输过程

服务器实现过程描述:

  • 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
  • 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
  • 3、使用bind函数给socket创建的SOCKET变量绑定一个本地地址
  • 4、使用listen函数监听客户机的连接请求信息,如有有客户机发送connect函数发送连接请求,那就使用accept还是接收connect发送的连接请求。接收成功那就返回一个句柄。这个过程是TCP协议区别于UDP协议的过程。
  • 5、连接成之后就可以进行数据传输。

客户机实现过程:

  • 1、使用WSAStartup函数初始化套接字接口,此函数的第一个参数是套接字的版本信息,第二参数一个WSADATA型的变量,这个变量中保存了WSAStartup函数初始化返回的套接字信息。
  • 2、使用socket函数创建一个套接字,创建成功之后就会返回一个SOCKET类型的套接字变量。
  • 3、使用connect函数向指定的网络服务器发送连接请求,如果请求成功,则进行数据传输,如果没有连接成功那就继续连接。

传输过程框图

在这里插入图片描述

服务器示例:

#pragma comment(lib,"ws2_32.lib")//引入动态套接字的库文件

#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
	WSADATA wasDate;//WSADATA,一种数据结构。这个结构被用来存储被
					//WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。
	SOCKET ListenSocket;//定义一个套接字,用于创建服务器的套接字
	SOCKET NewConnect;//定义一个套接字,用于接收新连接的套接字
	int Ret;//此变量记录初始化返回值
	SOCKADDR_IN ServerAddr;//定义一个地址变量存放服务器的地址
	SOCKADDR_IN  ClientAddr;//定义一个地址变量存放客户机的地址
	int Port = 5150;//定义一个端口
	int ClientAddrLen;//定义一个int变量,用于记录客户机的地址长度
	char DataBuffer[1024];
	if ((Ret = WSAStartup(MAKEWORD(2, 2), &wasDate)) != 0)//初始化套接字
	{
		printf("WSAStartup failed  with error %d ",Ret);
		return;
	}
	if ((ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)//创建套接字
	{
		printf("socket failed with error %d\n",WSAGetLastError());
		WSACleanup();
		return;
	}
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(Port);
	//ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//设置绑定客户机的IP,使用INADDR_ANY表示可以接收任意IP
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.2");
	if (bind(ListenSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//绑定服务器的套接字和客户机的地址
	{
		printf("bind failed with error %d\n",WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return;
	}
	if (listen(ListenSocket,5) == SOCKET_ERROR)//监听客户机连接
	{
		printf("listen failed with error %d\n",WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return;
	}
	printf("We are waiting a connection on port %d.\n",Port);
	printf("Listen(正在监听)...\n");
	ClientAddrLen = sizeof(SOCKADDR);
	//接收客户机,返回客户机的套接字,建立新连接
	if((NewConnect  = accept(ListenSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET)
	{
		printf("accept failed with error %d\n",WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return;
	}
	printf("We successfully got a connection from %s:%d\n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
	closesocket(ListenSocket);//关闭服务器的套接字
	printf("We are waiting to receive data\n");

	if((Ret = recv(NewConnect,DataBuffer,sizeof(DataBuffer),0)) == SOCKET_ERROR)
	{
		printf("recv failed with error %d\n", WSAGetLastError());
		closesocket(ListenSocket);
		WSACleanup();
		return;
	}


	printf("We successfully received %d bytes.\n",Ret);
	DataBuffer[Ret] = '\0';
	printf("%s\n",DataBuffer);
	printf("We are new going to close the client connection.\n");
	closesocket(ListenSocket);
	WSACleanup();
	system("pause");
}

客户机示例函数:

#pragma comment(lib,"ws2_32.lib")

#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
	WSADATA wsaData;//定义一个套接字初始化变量
	SOCKET s;//定义一个客户机套接字变量
	int Ret;
	int Port = 5150;
	SOCKADDR_IN ServerAddr;//定义一个IP

	//1、初始化套接字
	if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0)
	{
		printf("WSAStartup failed with error %d\n",Ret);
		return;
	}

	//2、创建套接字
	if ((s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) == INVALID_SOCKET)
	{
		printf("socket failed with error %d\n",WSAGetLastError());
		WSACleanup();
		return;
	}
	//3、根据服务器IP和端口连接服务器
	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(Port);
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	printf("We are trying to connect to %s:%d...\n", inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));
	if (connect(s,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
	{
		printf("connect failed with error %d\n",WSAGetLastError());
		closesocket(s);
		WSACleanup();
		return;
	}
	printf("Our connection succeeded.\n");
	printf("We will now try to send a hello messgae.\n");

	//4、服务器连接成功之后,向服务器发送Hello
	if ((Ret = send(s,"hello",5,0)) == SOCKET_ERROR)
	{
		printf("send failed with error %d\n",WSAGetLastError());
		closesocket(s);
		WSACleanup();
		return;
	}
	printf("we successfully sent %d bytes.\n",Ret);
	system("pause");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值