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

分布式练手:Server

步骤:
1.新建一个空项目,项目名称为Server,解决方案名称为Socket;
2.新建一个空项目名称为Client;
3.为Server构建一个头文件,一个源文件,Client同理。
4.右击项目Client,将SDL检查改为否。
5.按ctrl+F5先运行Server,再右击"Client"->调试->启动新实例;
6.开始运行,可以互相发送消息了。
 

源程序:【免费】分布式练手:Server资源-CSDN文库

#include"Server.h"
#include<stdio.h>
#include<stdlib.h>
int main()
{

    init_Socket();
    SOCKET serfd = CreateServerSocket();

Sign:printf("IP:127.0.0.1\n");
    printf("Listening port:%d \n", PORT);
    printf("wait Client connect...\n");

    //客户端请求连接
    SOCKET clifd = accept(serfd, NULL, NULL);
    if (INVALID_SOCKET == clifd)
    {
        err("accept");
    }
    //可以与客户端通信


    char recvbuf[BUFSIZ] = { 0 };
    char sendbuf[BUFSIZ] = { 0 };
    printf("Client connected...\n");

    while (true)
    {
        //接收消息
        if (0 < recv(clifd, recvbuf, BUFSIZ, 0))
        {
            printf("recv:%s\n", recvbuf);
            memset(recvbuf, 0, sizeof(recvbuf));

        }


        //给客户端发送消息
        printf("send>");
        gets_s(sendbuf, BUFSIZ);

        if (SOCKET_ERROR == send(clifd, sendbuf, strlen(sendbuf), 0))
        {
            err("send");
            printf("\n");
            printf("Client disconnected\n");
            goto Sign;
        }

        if (INVALID_SOCKET == clifd)
        {
            err("accept");
            return false;
        }


    }
    closesocket(clifd);
    closesocket(serfd);
    close_Socket();
    system("pause");

    return 0;

}


bool init_Socket()
{
    WSADATA wsadata;
    if (0 != WSAStartup(MAKEWORD(2, 2), &wsadata))
    {
        printf("WSAStartup failed code %d", WSAGetLastError());
        return false;
    }
    //WSA   Windows异步套接字
    //parm1 请求的Socket版本
    //parm2 传出参数
    return true;
}

bool close_Socket()
{
    if (0 != WSACleanup())
    {
        printf("WSACleanup failed code %d", WSAGetLastError());
        return false;
    }
    return true;
}

SOCKET CreateServerSocket()
{
    //1  创建空的Socket
    //af 地址协议族
    //type 传输协议类型: 流式套接字 数据报套接字
    //protocol 使用的具体传输协议
    SOCKET fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (fd == INVALID_SOCKET)
    {
        err("socket");
        return INVALID_SOCKET;
    }


    //2 绑定端口与ip地址
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.S_un.S_addr = ADDR_ANY;
    if (SOCKET_ERROR == bind(fd, (sockaddr*)&addr, sizeof(addr)))//SOCKET_ERROR == bind(fd, (sockaddr*)&addr, sizeof(addr))
    {
        err("bind");
        return false;
    }
    //监听
    listen(fd, 10);

    return fd;

}

TCP服务器程序,使用了Windows Socket API(WSA)在C语言中编写。`int main()`函数初始化套接字、创建服务器套接字,并开始监听客户端连接。

1. `init_Socket()` 函数用于初始化Windows套接字库(WSAStartup),设置所需的Socket版本并检查启动是否成功。
2. `CreateServerSocket()` 和 `accept()` 分别负责创建服务器端套接字和等待客户端连接。如果接受失败,会返回错误并处理。
3. 当有客户端连接后,进入一个无限循环,期间不断接收客户端发送的消息,然后将用户输入的内容发送回去。`recv()` 和 `send()` 函数分别用于接收和发送数据。
4. 如果在发送数据过程中发生错误或断开连接,会打印错误信息,并关闭相应的套接字(clifd和serfd)。
5. 循环结束后,关闭所有套接字资源(close_Socket()),暂停程序(system("pause"))等待用户按键,最后返回0表示正常退出。


http://www.kler.cn/a/466338.html

相关文章:

  • 【python因果库实战15】因果生存分析4
  • Java字符编码与正则表达式深度解析
  • spring mvc源码学习笔记之五
  • 三、GIT与Github推送(上传)和克隆(下载)
  • GESP真题 | 2024年12月1级-编程题2《奇数和偶数》及答案(Python版)
  • Swift Protocols(协议)、Extensions(扩展)、Error Handling(错误处理)、Generics(泛型)
  • 如何得到深度学习模型的参数量和计算复杂度
  • 【图像处理】OpenCv + Python 实现 Photoshop 中的色彩平衡功能
  • 机器学习经典算法——逻辑回归
  • 在K8S中,Pod请求另一个Pod偶尔出现超时或延迟,如何排查?
  • 【LeetCode】803、打砖块
  • BurpSuite2024.11
  • JLINK V9插入电脑没反应
  • 基于深度学习的视觉检测小项目(二) 环境和框架搭建
  • pytorch张量高级索引介绍
  • Sublime Text4 4189 安装激活【 2025年1月3日 亲测可用】
  • LLM 中的 Decoder Only
  • df.set_index(‘name‘).groupby(‘team‘).apply(first_3, ‘Q1‘)
  • 被催更了,2025元旦源码继续免费送
  • 一文讲清楚webpack和vite原理
  • Vue 快速入门:开启前端新征程
  • 像品茶一样品设计模式,早日突破编码新境界。
  • 2025 年软件行业展望:除了 AI,还有更多精彩
  • STM32CUBE快速入门02
  • 免费下载 | 2024网络安全产业发展核心洞察与趋势预测
  • 【VUE】使用create-vue快速创建一个vue + vite +vue-route 等其他查看的工程