Winsock2使用记录 您所在的位置:网站首页 什么是wsa Winsock2使用记录

Winsock2使用记录

2023-10-23 12:40| 来源: 网络整理| 查看: 265

本文地址:https://www.cnblogs.com/oberon-zjt0806/p/14814144.html WinSock 2 MSDN文档:https://docs.microsoft.com/en-us/windows/win32/winsock/windows-sockets-start-page-2 一个很好的范例(如果我的代码有问题,可供参考这个):https://github.com/gaohaoning/cpp_socket

目录什么是WinSock?WorkflowServer Side(服务端)初始化WSA建立服务端套接字为Server socket绑定地址启动服务端监听获取连入的客户端收发数据关闭套接字、释放WSAClient Side(客户端)与服务端的积极连接当你遇到错误时……代码汇总ServerClient

什么是WinSock?

这还不简单,当然是Windows的袜子啦

WinSock(全称Windows Sockets)是巨硬微软提供的用于Windows平台的C++网络连接库。

简单来说我们知道在Java中,我们可以通过JDK提供的java.net库来实现建立套接字的TCP/UDP传输:

public class Client { private String svrip = ""; private int port; public AnotherClient(String serverIP,int port) { svrip = serverIP; this.port = port; } public void Start() { Socket cltsock = null; // Client's socket OutputStream ostrm = null; // O-stream for sending to server BufferedWriter bwriter = null; InputStream istrm = null; BufferedReader breader = null; try { cltsock = new Socket(svrip,port); System.out.println(String.format("Client at %s has started.", cltsock.getInetAddress().toString())); istrm = cltsock.getInputStream(); // .....后面不写了,意思意思得了

WinSock的功能与之类似,只不过因为结构僵化的C++标准委员会迟迟不将专用于C++网络连接的纳入STL(标准库)中,所以我们这里只好委曲求全地使用Windows的标准,在Linux环境中,替代品为系统内核提供的库。不过整体使用上,两者区别并不那么大。

Winsock比较常用的有两类版本——1.1和2.x。本文这里,当然了,标题也说了,以Winsock2为准,建立一个IPv4协议下的传输链路。

Workflow

嗯,自从因为各种原因对自己产生了一个巨大的否定以来,我发现总结一个具体的工作流程(Workflow)出来还是挺重要的一件事。

那么,我们这里就尝试总结一下,建立一个连接并发送消息期间,Winsock都做了什么:

graph TD subgraph server[Server] begin[开始] --> init[初始化WSA] --> setupsvr[建立Server Socket] --> binding[设置地址绑定] --> listening[Server Socket启动监听] accept((接收来自Client的连接)) recv[接收来自Client的消息] send[向Client发送信息] close[关闭Server Socket] terminal[结束] listening --> accept accept --> send accept --> recv send --> close recv --> close close --> terminal end subgraph client[Client] beginc[开始] --> initc[初始化WSA] --> setupclt[建立Client Socket] connect{连接ip所在的Server的连接} crecv[接收来自Server的消息] csend[向Server发送信息] cclose[关闭Client Socket] terminalc[结束] setupclt --> connect connect --> csend connect --> crecv csend --> cclose crecv --> cclose cclose --> terminalc end csend -.-> recv send -.-> crecv Server Side(服务端)

先说Server这边,从上面这张图来看,他做了这么几件事:

初始化WSA 所谓WSA就是WinSock API,当然了,因为我们这里用的是Winsock2,所以我们做的就是对Winsock2的初始化,毕竟只有初始化之后我们才能使用Winsock里面的相关功能,当然具体来说这里其实还包括一些其他的事情,比如版本比对之类的。

建立Server的套接字 当我们可以使用Winsock的相关功能后,我们就可以通过Winsock建立套接字以建立连接了。

绑定地址 这个先留着,放到代码里再说……

启动监听 当套接字被启动后,我们允许该套接字监听是否有外部的客户端的连接请求

接收Client的连接 有Client的时候我们获得这位Client的套接字。

收发消息 连接建立完成了,可以传输数据了

结束 打完收工!

初始化WSA

既然我们使用Winsock2,那么我们首先做的必然就是对Winsock2的调取,原始的来说,Winsock2隶属于Win32的系统库,当你引入头文件WinSock2.h的时候你就已经获得了Winsock2的结构声明。当然,为了让他能够调取系统库,我们需要把他静态链接进来

#include #include //??? #pragma comment(lib, "WS2_32.lib")

注意,上面第2行中,我又引入了一个ws2tcpip.h,这是因为在Winsock2.h中声明的有关函数不再倡用了(Deprecated),这种情况下直接使用这类函数会直接触发错误,当然,如果你执意要用的话,那就在最开始的时候补充一下抑制宏:

//如果你非要使用Deprecated内容的话 #define _WINSOCK_DEPRECATED_NO_WARNINGS // includes... pragma...

然后我们开始在Server的主程序里初始化WSA,初始化过程主要经过:设置版本限制→初始化→获得初始化信息,因此我们首先设置我们能接受的WinSock库的最低版本:

WORD verRequest = MAKEWORD(1, 1);

虽然说我们用的是WinSock2,不过我们这里本着向下兼容的原则,我们约定要是只有1.1也行…… 然后我们需要使用WSAStartup函数来真正初始化WSA,这个函数接收两个参数,一个版本约定和一个数据结构:

WSAData wData; int $err = WSAStartup(wVersionRequest, &wData);

初始化期间,系统会根据你提供的Version Request来评估当前系统内的Winsock版本,并将结果写进wData中,返回初始化失败的错误代码,如果没有错误返回0,因此,这里我们在发生错误的情况下直接结束程序。

if($err != 0) { cout


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有