C++之Socket

电脑与电脑之间的通讯其实是Socket与Socket之间的通讯
学习Socket是网络开发的必经之路
学习Socket之前最好有点TCP/IP协议的基础
下图是我在学习过程之中整理的笔记,后期会继续完善
如果看不清右击在新建标签中打开
这里写图片描述

知道网络协议之后便可以开始敲Socket了
先看效果图:
这里写图片描述
下面是SocketC++的源代码
IDE:Visual Studio 2017

其中sin_addr函数过旧
需要把cpp的属性SDL检查关掉
不然编辑器编译不通过

//server
#include "stdafx.h"
#include <stdio.h>
#include <winsock2.h>                           //包含socket的头文件
#pragma comment (lib, "ws2_32.lib")             //加载 ws2_32.dll
int main() {
    WSADATA wsaData;                            //定义一个结构体对象
    WSAStartup(MAKEWORD(2, 2), &wsaData);       //初始化WSAStartup()函数,,,(规范的版本号,指向WSADATA结构体的指针),,,MSKEWORD(2,2)主版本号2,副版本号2

    SOCKET servSock = socket(PF_INET, SOCK_STREAM, 0);      //参数(1)IP地址类型PF_INET6为IPv6,(2)数据传输方式 SOCK_STREAM 和 SOCK_DGRAM (3)传输协议 IPPROTO_TCP 和 IPPTOTO_UDP,如果写0系统会自动计算处使用那种协议
    sockaddr_in sockAddr;                                       //创建sockaddr_in结构体变量
    memset(&sockAddr, 0, sizeof(sockAddr));                     //每个字节都用0填充
    sockAddr.sin_family = PF_INET;                              //使用IPv4地址
    sockAddr.sin_port = htons(1234);                            //端口号   要用到htons()函数转换
    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");          //具体的IP地址32位

    bind(servSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));             //绑定套接字,
    printf("绑定套接字成功\n");
    listen(servSock, 20);                               
    printf("服务器已经进入监听状态\n");
    SOCKADDR clntAddr;
    int nSize = sizeof(SOCKADDR);
    SOCKET clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &nSize);       
    printf("accept函数执行完毕开始接收用户输入\n");


    printf("输入一句话并按回车\n");
    char tack[10];

    scanf("%s", &tack);

    //向客户端发送数据
    send(clntSock, tack, strlen(tack) + sizeof(char), NULL);    

    printf("数据发送成功\n");

    //关闭套接字
    closesocket(clntSock);
    closesocket(servSock);
    //终止 DLL 的使用
    WSACleanup();
    system("PAUSE");
    return 0;
}
//client
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>                       //包含WinSock2.h头文件
#pragma comment(lib, "ws2_32.lib")          //加载 ws2_32.dll 
int main() {
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);       //初始化版本
    SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);      //创建用户端socket

    //向服务器发起请求
    sockaddr_in sockAddr;                               //创建sockAddr结构体
    memset(&sockAddr, 0, sizeof(sockAddr));              //每个字节都用0填充
    sockAddr.sin_family = PF_INET;
    sockAddr.sin_port = htons(1234);
    sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));      //建立链接
    printf("客户端发送链接请求\n");


    //接收服务器传回的数据
    char szBuffer[MAXBYTE] = { 0 };
    recv(sock, szBuffer, MAXBYTE, NULL);
    printf("接收服务器传回的消息函数\n");

    //输出接收到的数据
    printf("服务器: %s\n", szBuffer);

    //关闭套接字、终止使用 DLL
    closesocket(sock);
    WSACleanup();
    system("PAUSE");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36409711/article/details/78937137