winsocket<一> 套接字基础

最近在学习winsocket整理一下:

IP与端口:

1、网络中有很多的主机,怎么区分主机?

             用IP来标识不同的主机,其中现在主要用的是IPV4(32位),随着发展,IPV4无法满足连入的主机数量——地址不够用,所以以后应用更强大的IPV6(128为)。

 2、同一台主机中有很多的服务,如何区分不同的服务?

            用端口号来区分不同的服务,端口号是一个整数,范围是:0 ~ 65535;对应于TCP和UDP有相应的TCP端口和UDP端口

            其中:0-1023为通用端口,这些端口已经绑定了某些服务;

                      1024-49151 为已注册端口号,供一般程序使用,我们开发winsocket程序时使用这个范围内的端口;

      49152-65535为动态或私有端口


在winsocket中套接字SOCKET的定义:

typedef unsigned int u_int;

typedef u_int SOCKET;

从上面的定义我们可以得知其实,SOCKET就是一个无符号的整数,并且INVALID_SOCKET是唯一一个无效的套接字,其他所有的 0 - INVALID_SOCKET-1都是有效的(INVALID_SOCKET = 4294967295,这是我直接把INVALID_SOCKET打印出来的结果);由于INVALID_SOCKET是一个无效的套接字,所以我们可以利用这个值来判断我们创建的套接字是否有效。

INVALID_SOCKET的申明:#define INVALID_SOCKET (SOCKET)(~0)


一、TCP套接字基础

基本的模式:

     Server端:创建socket->绑定地址->设置为监听->接受链接->交互数据(收发数据)->关闭

     Client端:创建socket->连接服务器->交互数据(收发数据)->关闭


<span style="font-size:14px;">//Server端
#include<iostream>
#include <WINSOCK2.H>
#pragma comment(lib, "ws2_32.lib")
using namespace std;

int main()
{
	//<1>创建Socket
	WORD wVersionRequested;//版本
	WSADATA wsaData;//
	int nErrorCode;//错误代码
	wVersionRequested = MAKEWORD(2, 2);//生成版本
	nErrorCode = WSAStartup(wVersionRequested, &wsaData);
	
	if (nErrorCode != 0)
	{//winsocket异步套接字启动失败情况
		cout << "WinSocket fail startup!" << endl;
		return 1;
	}

	//check version
	if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
	{
		WSACleanup();//delete data
		return 1;
	}

	SOCKET sockServer;
	sockServer = socket(AF_INET, SOCK_STREAM, 0);

	//<2>绑定地址
	SOCKADDR_IN addrServer;
	addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(8888);
	bind(sockServer, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));

	//<3>打开监听
	listen(sockServer, 5);

	SOCKADDR_IN addrClient;
	int nLen = sizeof(SOCKADDR);
	cout << "here is Server" << endl;
	while (true)
	{
		//<4>接受链接
		SOCKET sockConn = accept(sockServer, (SOCKADDR *)&addrClient, &nLen);
		char sendBuf[1024] = {0};
		
		sprintf_s(sendBuf, sizeof(sendBuf), "Welcome %s to here!\nwhat can I help you?");
		send(sockConn, sendBuf, strlen(sendBuf)+1, 0);
		char recvBuf[1024] = {0};
		//<5>数据交互
		while (true)
		{
			//收数据
			recv(sockConn, recvBuf, sizeof(recvBuf) - 1, 0);
			cout << "Client: " << recvBuf << endl;
			if (recvBuf[0] == 'n'){ break; }
			cout << "Server: ";
			cin >> sendBuf;
			//发数据
			send(sockConn, sendBuf, strlen(sendBuf)+1, 0);
		}
		//<6>关闭socket
		closesocket(sockConn);
	}

	system("pause");
	return 0;
}</span>

<span style="font-size:14px;">//Client端
#include<iostream>
#include<WINSOCK2.H>
#pragma comment(lib, "ws2_32.lib")

using namespace std;

int main()
{
	//<1>创建socket
	WORD wVersion;
	WSADATA wsaData;
	int nErrorCode;
	wVersion = MAKEWORD(2, 2);
	nErrorCode = WSAStartup(wVersion, &wsaData);
	if (nErrorCode != 0)
	{
		cout << "WinSocket fail startup !" << endl;
		return 1;
	}

	if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
	{
		WSACleanup();
		return 1;
	}

	SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);

	SOCKADDR_IN addrServer;
	addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(8888);

	//<2>链接服务器
	connect(sockClient, (SOCKADDR *)&addrServer, sizeof(SOCKADDR));

	char sendBuf[1024] = { 0 };
	char recvBuf[1024] = { 0 };

	cout << "here is Client !" << endl;
	//<3>数据交互
	while (true)
	{
		//收
		recv(sockClient, recvBuf, sizeof(recvBuf) - 1, 0);
		cout << "Server: " << recvBuf << endl;
		if (recvBuf[0] == 0)
		{
			break;
		}
		cout << "Client: ";
		cin >> sendBuf;
		//发
		send(sockClient, sendBuf, strlen(sendBuf) + 1, 0);
	}

	//<4>关闭socket
	closesocket(sockClient);
	WSACleanup();
	system("pause");
	return 0;
}</span>


二、UDP套接字基础

server端:创建socket->绑定地址->数据交互->关闭

Client端:创建socket->数据交互->关闭



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值