WinSocket编程笔记(一)

前言:

因为疫情原因,现在一直在网上授课,教师在讲述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

[WinSocket编程]

posted @ 2020-04-06 22:21  ch0bits  阅读(665)  评论(0编辑  收藏  举报