欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 分布式练手:Server

分布式练手:Server

2025/1/24 10:28:25 来源:https://blog.csdn.net/XLYcmy/article/details/144695136  浏览:    关键词:分布式练手: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表示正常退出。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com