前言:
因为疫情原因,现在一直在网上授课,教师在讲述winsocket这一课程时没有给予我们课本,只有毫不相搭的linux环境的socket编程视频,故于此(开学第七周)总结winsocket的内容。
注:
以下代码都以C++环境为例
一.Windows Socket 基础
Windows Socket DLL的初始化和释放函数的调用方法
- 库函数语法, 符号常量, 数据机构在 WinSock2.h
- 静态编译时用 ws2_32.lib
- 动态调用时用 ws2_32.dll
- 支持多种协议
- 支持服务质量 QoS
- 增加异步机制和重叠I/O
- 更多的函数
Windows socket 网络编程思路 1.初始化 Windows socket 2.创建socket 3.将socket与地址结构绑定 4.发送/接收数据 5.释放socket 6.终止Windows socket socket常用函数和数据结构:
//windows socket 的初始化和终止 WSAStartup WSACleanup
//创建和释放socket
socket closesocket
//绑定socket和地址结构 bind listen accept connetc sockaddr sockaddr_in in_addr
//发送, 接收数据 send sendto recv recvfrom
头文件:
#include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib")
初始化函数 WSAStartup
写在主函数中(写在main()中的参数):
WSADATA wsaData; ::WSAStartup(MAKEWORD(2,2),&wsaData);
或者写成:
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return 1;
}
注销函数WSACleanup
::WSACleanup();
或者:
WSACleanup();
socket创建函数
原型:
SOCKET socket(int af, int type, int protocol);//这里定义名称为小写socket
创建TCP套接字:
SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
或者:
SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET){ cout << "Socket error" << endl;
closesocket 关闭函数
closesocket(clientSocket);
其中()中为自己定义的socket名称
实战:
#include<winsock2.h> #include<iostream> #include<string> using namespace std; #pragma comment(lib, "ws2_32.lib") int main() { WORD sockVersion = MAKEWORD(2, 2); WSADATA data; if (WSAStartup(sockVersion, &data) != 0) { return 1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); closesocket(clientSocket); WSACleanup(); return 0; }
结果:
因为只是创建了套接字,关闭套接字,所以程序直接退出
(待续)
Reference