Windows Sockets 2的简单实现

Windows Sockets 2 的简单实现

Windows Sockets 是 Microsoft Windows 的网络程序设计接口,是从 Berkeley Sockets 扩展而来的,以动态链接库的方式提供给开发者使用

Windows Sockets 1.1 和 Berkeley Sockets 都是基于 TCP/IP 协议设计的

Windows Sockets 2 是从 Windows Sockets 1.1 发展而来,与协议无关且向下兼容,可以使用任何底层传输协议提供的通讯能力来为上层应用程序完成网络数据通信而不关心底层网络链路的通信情况,实现了底层通信对应用程序的透明

基于 TCP 的 socket 编程(面向连接)

编写TCP socket的服务端

1、创建套接字------socket()

2、将套接字绑定到本地的IP和Prot上------bind()

3、套接字监听------listen()

4、等待客户端请求------accept()

5、与建立了连接的客户端进行通信------send()/recv()

6、关闭套接字------closesocket()

//Socket所需头文件
#include <WinSock2.h>
#include <WS2tcpip.h>
int main()
{
		//加载套接字库
		WORD m_wVersion = MAKEWORD(1, 1);
		WSAData m_wsaData;

		if (WSAStartup(m_wVersion, &m_wsaData) != 0)
		{
			return -1;
		}

		if (LOBYTE(m_wsaData.wVersion) != 1 || HIBYTE(m_wsaData.wVersion) != 1)
		{
			WSACleanup();
			return -1;
		}
		//创建套接字
		SOCKET Sock_Server = socket(AF_INET, SOCK_STREAM, 0);
		//设定地址、端口
		SOCKADDR_IN m_addrServer;
		m_addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
		m_addrServer.sin_family = AF_INET;
		m_addrServer.sin_port = htons(5050);
		//绑定套接字
		bind(Sock_Server, (SOCKADDR*)&m_addrServer, sizeof(SOCKADDR));
		//监听套接字
		listen(Sock_Server, 8);
		//客户端接入对象
		SOCKADDR_IN m_addrClient;
		int nAddrLen = sizeof(SOCKADDR);

		while (TRUE)
		{
			SOCKET Sock_Client = accept(Sock_Server, (SOCKADDR*)&m_addrClient, &nAddrLen);
			
			char sendBuf[1024] = "JUMP-Server";
			char recvBuf[1024];
			send(Sock_Client, sendBuf, strlen(sendBuf) + 1, 0);
			recv(Sock_Client, recvBuf, 1024, 0);
			printf("RECVDATA:%s\n",recvBuf);
			closesocket(Sock_Client);
		}
		return 0;
}

编写TCP socket的客户端

1、创建套接字------socket()

2、向服务端发出连接请求------connect()

3、与建立了连接的服务端进行通信------send()/recv()

4、关闭套接字------closesocket()

//Socket所需头文件
#include <WinSock2.h>
#include <WS2tcpip.h>
int main()
{
		//加载套接字库
		WORD m_wVersion = MAKEWORD(1, 1);
		WSAData m_wsaData;

		if (WSAStartup(m_wVersion, &m_wsaData) != 0)
		{
			return -1;
		}

		if (LOBYTE(m_wsaData.wVersion) != 1 || HIBYTE(m_wsaData.wVersion) != 1)
		{
			WSACleanup();
			return -1;
		}
		//创建套接字
		SOCKET Sock_Client = socket(AF_INET, SOCK_STREAM, 0);

		SOCKADDR_IN addrServer;
		inet_pton(AF_INET, "127.0.0.1", &addrServer.sin_addr);
		addrServer.sin_family = AF_INET;
		addrServer.sin_port = htons(5050);
		//连接请求
		connect(Sock_Client, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
		//通信
		char recvBuf[1024];
		recv(Sock_Client, recvBuf, 1024, 0);
		printf("RECVDATA:%s\n", recvBuf);
		send(Sock_Client, "JUMP-Client", strlen("JUMP-Client") + 1, 0);
		//关闭套接字
		closesocket(Sock_Client);
		//终止对WinSock库的使用
		WSACleanup();
		system("PAUSE");
		return 0;
}

图解基于 TCP 的 socket 编程步骤
图解基于 TCP 的 socket 编程步骤

基于 UDP 的 socket 编程(面向无连接)

编写UDP socket的接收端

1、创建套接字------socket()

2、将套接字绑定到本地的IP和Prot上------bind()

3、等待接收数据------recvfrom()

4、关闭套接字------closesocket()

//Socket所需头文件
#include <WinSock2.h>
#include <WS2tcpip.h>
int main()
{
		//加载套接字库
		WORD m_wVersion = MAKEWORD(1, 1);
		WSAData m_wsaData;

		if (WSAStartup(m_wVersion, &m_wsaData) != 0)
		{
			return -1;
		}

		if (LOBYTE(m_wsaData.wVersion) != 1 || HIBYTE(m_wsaData.wVersion) != 1)
		{
			WSACleanup();
			return -1;
		}
		//创建套接字
		SOCKET Sock_Server = socket(AF_INET, SOCK_DGRAM, 0);
		//设定地址、端口
		SOCKADDR_IN m_addrServer;
		m_addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
		m_addrServer.sin_family = AF_INET;
		m_addrServer.sin_port = htons(5050);
		//绑定套接字
		bind(Sock_Server, (SOCKADDR*)&m_addrServer, sizeof(SOCKADDR));
		//等待接收数据
		SOCKADDR_IN m_addrClient;
		int nAddrLen = sizeof(SOCKADDR);
		char recvBuf[1024];
		recvfrom(Sock_Server,recvBuf,1024,0,(SOCKADDR*)&m_addrClient,&nAddrLen);
		printf("RECVDATA:%s\n", recvBuf);
		//关闭套接字
		closesocket(Sock_Client);
		//终止对WinSock库的使用
		WSACleanup();
		return 0;
}

编写UDP socket的发送端

1、创建套接字------socket()

2、向接收端发送数据------sendto()

3、关闭套接字------closesocket()

//Socket所需头文件
#include <WinSock2.h>
#include <WS2tcpip.h>
int main()
{
		//加载套接字库
		WORD m_wVersion = MAKEWORD(1, 1);
		WSAData m_wsaData;

		if (WSAStartup(m_wVersion, &m_wsaData) != 0)
		{
			return -1;
		}

		if (LOBYTE(m_wsaData.wVersion) != 1 || HIBYTE(m_wsaData.wVersion) != 1)
		{
			WSACleanup();
			return -1;
		}
		//创建套接字
		SOCKET Sock_Client = socket(AF_INET, SOCK_DGRAM, 0);
		
		SOCKADDR_IN addrServer;
		inet_pton(AF_INET, "127.0.0.1", &addrServer.sin_addr);
		addrServer.sin_family = AF_INET;
		addrServer.sin_port = htons(5050);
		//发送数据
		sendto(Sock_Client,"JUMP-Client", strlen("JUMP-Client") + 1, 0 ,(SOCKADDR*)&addrServer, sizeof(SOCKADDR));
		//关闭套接字
		closesocket(Sock_Client);
		//终止对WinSock库的使用
		WSACleanup();
		return 0;
}

图解基于 UDP 的 socket 编程步骤

基于 UDP 的 socket 编程步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值