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 编程步骤
基于 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 编程步骤