当前位置: 首页 > news >正文

winSockets编程(三)最简单的C/S形式

功能:向服务器端发送一个字符串,属于最简易的形式,一共需要4个主要步骤,初始化-建立套接字-连接服务器-发送数据

/************************************************************************
*     此代码为最简易的客户端形式,需要背诵 
*     作者:    Tinaluo
*     日期:    2017/10/24
************************************************************************/

#include <WinSock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")

int main()
{
    WSADATA wsd;
    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
    {
        std::cout << "版本不支持" << std::endl;
        return -1;
    }

    SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == sHost)
    {
        std::cout << "创建套接字失败" << std::endl;
        WSACleanup();
        return -1;
    }

    SOCKADDR_IN servAddr;
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servAddr.sin_port = htons(8000);
    int retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr));
    if (retVal == SOCKET_ERROR)
    {
        std::cout << "连接服务器失败!" << std::endl;
        closesocket(sHost);
        WSACleanup();
        return -1;
    }

    char buf[MAX_PATH];
    ZeroMemory(buf, MAX_PATH);
    strcpy_s(buf, "Connect successful!");
    retVal = send(sHost, buf, strlen(buf), 0);
    if (retVal == SOCKET_ERROR)
    {
        std::cout << "发送失败!" << std::endl;
        closesocket(sHost);
        WSACleanup();
        return -1;
    }

    std::cout << "关闭套接字!" << std::endl;
    closesocket(sHost);
    WSACleanup();
    return 0;
}

服务端

/************************************************************************
*    最简易服务器端
*    目标:接收客户端问候(此程序需要极其熟练并背诵!)
*    作者:Luotian
*    日期:2017/10/25
************************************************************************/
#include <iostream>
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")

int main()
{    
    WSADATA wsd;
    if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
    {
        std::cout << "初始化失败!" << std::endl;
        return -1;
    }

    SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == serverSocket)
    {
        std::cout << "创建套接字失败!" << std::endl;
        WSACleanup();
        return  -1;
    }

    SOCKADDR_IN addrServ;
    addrServ.sin_family = AF_INET;
    addrServ.sin_port = htons(8000);
    addrServ.sin_addr.s_addr = INADDR_ANY;
    
    int retVal = bind(serverSocket, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
    if (SOCKET_ERROR == retVal)
    {
        std::cout << " 绑定套接字失败!" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    retVal = listen(serverSocket, 1);
    if (SOCKET_ERROR == retVal)
    {
        std::cout << "创建监听失败!" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    sockaddr_in addrClient;
    int addrClientlen = sizeof(addrClient);
    SOCKET clientSocket = accept(serverSocket, (sockaddr FAR*)&addrClient, &addrClientlen);
    if (INVALID_SOCKET == clientSocket)
    {
        std::cout << "接受请求失败!" << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return -1;
    }

    char buf[MAX_PATH];
    ZeroMemory(buf, MAX_PATH);
    retVal = recv(clientSocket, buf, MAX_PATH, 0);
    if (SOCKET_ERROR == retVal)
    {
        std::cout << "获取数据失败!" << std::endl;
        closesocket(serverSocket);
        closesocket(clientSocket);
        WSACleanup();
        return -1;
    }
    std::cout <<buf<< std::endl;

    closesocket(serverSocket);
    closesocket(clientSocket);
    WSACleanup();
    return 0;
}

 

转载于:https://www.cnblogs.com/tinaluo/p/7682102.html

相关文章:

  • 在 DLL工程中加入新 CFormView时的 注意事项
  • 网络问题排查
  • 游戏中汉字显示的实现与技巧[ZZ]
  • 源码探探之StartActivity(一)
  • 《见与不见》
  • 旅行(LCA)
  • Linux正则表达式元字符
  • AMD首款APU的价值和机会
  • BMap:JavaScript API
  • Java注释讲解
  • Android前景,前途(转)
  • GPU的线程模型和内存模型
  • 深入浅出ShellExecute
  • 概率校准Probability Calibration
  • PHP漏洞全解(九)-文件上传漏洞
  • CSS盒模型深入
  • github指令
  • Git的一些常用操作
  • hadoop集群管理系统搭建规划说明
  • javascript 总结(常用工具类的封装)
  • Mocha测试初探
  • React Native移动开发实战-3-实现页面间的数据传递
  • spring boot下thymeleaf全局静态变量配置
  • tweak 支持第三方库
  • 简析gRPC client 连接管理
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 算法-图和图算法
  • 【干货分享】dos命令大全
  • Nginx实现动静分离
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​configparser --- 配置文件解析器​
  • #100天计划# 2013年9月29日
  • (Forward) Music Player: From UI Proposal to Code
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (八)Spring源码解析:Spring MVC
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)Controller接口控制器详解(三)
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .java 9 找不到符号_java找不到符号
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET关于 跳过SSL中遇到的问题
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /etc/fstab和/etc/mtab的区别
  • @ModelAttribute 注解
  • @Resource和@Autowired的区别
  • @Transactional类内部访问失效原因详解
  • []sim300 GPRS数据收发程序
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [BZOJ1010] [HNOI2008] 玩具装箱toy (斜率优化)