一个13号 2023-03-28 09:02 采纳率: 66.7%
浏览 60
已结题

socket套接字能建立连接,不能传递数据。

想写一个用socket套接字传递指令,实现服务器让客户端关机的功能。但是出现了问题:服务器端和客户端能建立连接,但传递不了数据。
防火墙是关闭的,求大家帮忙看看代码哪里有问题,感谢。

服务器端代码:

/*
    服务器
*/
#include<iostream>
#include<string>
#include<WinSock2.h>  //网络套接字的处理头文件
#pragma comment(lib,"WS2_32.lib")
using namespace std;

//函数声明
void InitSocket();
SOCKET Listen(int);
void ShutdownClient();

int main()
{
    InitSocket();
    ShutdownClient();
    return 0;
}

void InitSocket() //初始化网络套接字资源
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        cout << "初始化套接字失败" << endl;
        exit(0);
    }
    cout << "初始化套接字成功" << endl;
}

SOCKET Listen(int port = 31211) //监听客户端发来的请求
{
    //创建套接字
    SOCKET server = socket(AF_INET, SOCK_STREAM, 0); 
    if (INVALID_SOCKET == server)//判断是否为无效套接字
    {
        cout << "创建套接字失败" << endl;
        exit(0);
    }
    cout << "创建套接字成功" << endl;
    SOCKADDR_IN addr; //创建ip地址
    memset(&addr, 0, sizeof(addr)); //初始化
    addr.sin_family = AF_INET;//设置ip地址的类型
    addr.sin_port = htons(port);
    addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //允许任何ip连接
    if (bind(server, (SOCKADDR*)&addr, sizeof(addr)) != 0)
    {
        cout << "绑定失败" << endl;
        exit(0);
    }
    listen(server, 5);
    return server;
}

void ShutdownClient() //关闭客户端
{
    SOCKET server = Listen();
    SOCKET client;
    SOCKADDR_IN addr;
    int addrSize = sizeof(addr);
    string shutdown_command = "shutdown -h now"; // 关机指令
    int command_size;
    cout << "正在接收客户端连接..." << endl;
    if (client = accept(server, (SOCKADDR*)&addr, &addrSize) < 0)
    {
        cout << "接收客户端连接失败" << endl;
        exit(0);
    }
    cout << "接收客户端连接成功!" << endl;

    command_size = shutdown_command.size();
    //发送数据大小
    if (send(client, (char*)&command_size, sizeof(command_size), 0) == -1)
    {
        cout << "大小发送失败" << endl;
        exit(0);
    }
    cout << "大小发送成功" << endl;
    //发送指令
    if (send(client, shutdown_command.c_str(), command_size, 0) == -1)
    {
        cout << "发送失败" << endl;
        exit(0);
    }
    cout << "指令已发送给客户端!" << endl;
    closesocket(client);
}

客户端代码:

/*
    客户端
*/
#include<iostream>
#include<string>
#include<WinSock2.h>  //网络套接字的处理头文件
#pragma comment(lib,"WS2_32.lib")
using namespace std;

//声明函数
void InitSocket();
SOCKET ConnectServer(const char*, int);
void RCVCommand();

int main()
{
    InitSocket();
    RCVCommand();
}

void InitSocket() //初始化网络套接字资源
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData))
    {
        cout << "初始化套接字失败" << endl;
        exit(0);
    }
    cout << "初始化套接字成功" << endl;
}

SOCKET ConnectServer(const char* ip, int port = 31211) //请求连接服务器,返回值为套接字,端口号自定义
{
    //创建套接字
    SOCKET server = socket(AF_INET, SOCK_STREAM, 0); //(类型,协议,保留参数)
    if (INVALID_SOCKET == server) //判断是否为无效套接字
    {
        cout << "创建套接字失败" << endl;
        exit(0);
    }
    cout << "创建套接字成功,正在连接服务器..." << endl;
    //ip地址处理
    SOCKADDR_IN addr; //创建ip地址
    memset(&addr, 0, sizeof(addr)); //初始化
    addr.sin_family = AF_INET; //设置ip地址的类型
    addr.sin_port = htons(port); //设置端口,hotons()设置为网络字节顺序
    addr.sin_addr.S_un.S_addr = inet_addr(ip);//连接服务器的ip地址
    //发出请求
    if (connect(server, (SOCKADDR*)&addr, sizeof(addr)) != 0)
    {
        cout << "与服务器连接失败" << WSAGetLastError() << endl;
        return INVALID_SOCKET;
    }
    cout << "连接服务器成功!" << endl;
    return server;
}

void RCVCommand()
{
    int command_size;
    SOCKET server = ConnectServer("127.0.0.1");
    //接收数据大小
    if(recv(server,(char*) & command_size, sizeof(command_size), 0) == -1)
    {
        cout << "接收大小失败" << endl;
        exit(0);
    }
    cout << "接收大小成功" << endl;
    
    char* buffer = new char[command_size+1];
    buffer[command_size] = '\0';
    //接收指令
    if (recv(server, buffer, command_size, 0) == -1)
    {
        cout << "指令接收失败" << endl;
        exit(0);
    }
    cout << buffer << endl;
    //system(buffer);
    //cout << "正在关机" << endl;
    closesocket(server);
}

运行结果:

img

  • 写回答

2条回答 默认 最新

  • isMae 2023-03-28 12:01
    关注

    服务端代码第66行好像是运算符的优先级错了,你试试改成这样

    if ((client = accept(server, (SOCKADDR*)&addr, &addrSize)) < 0)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 已采纳回答 3月28日
  • 创建了问题 3月28日

悬赏问题

  • ¥15 visionmaster启动失败,提示为“机器不满足授权而被禁用”
  • ¥50 用logisim设计16位单时钟周期cpu
  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中
  • ¥15 weautomate读取Excel表格信息然后填写到网页一直报错,如何解决?
  • ¥15 C#如何在Webview2中获取网页验证码