C++ 为什么从客户端向服务器发送数据时出现分段错误?

C++ 为什么从客户端向服务器发送数据时出现分段错误?,c++,client-server,C++,Client Server,我制作了一个客户端-服务器程序,它接受4个参数。输入文件、输出文件、IP地址、端口号。但当我试图发送一个结束字符时,我遇到了分割错误 server.cpp #include <unistd.h> #include <iostream> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #incl

我制作了一个客户端-服务器程序,它接受4个参数。输入文件、输出文件、IP地址、端口号。但当我试图发送一个结束字符时,我遇到了分割错误

server.cpp

#include <unistd.h>
#include <iostream>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <fstream>
#include <iomanip>
using namespace std;

int main (int argc, char **argv)
{
    int sock, cli, read_size, file_size;    //cli socket descriptor
    struct sockaddr_in server, client;
    char *send_buffer;
    char *fname;

    unsigned int sock_len;
    ofstream fout;

    cout << "Initializing a Socket\n";
    if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("Socket: ");
        close(sock);
        exit(-1);
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(7246);
    server.sin_addr.s_addr = INADDR_ANY;
    bzero(&server.sin_zero, 0);

    sock_len = sizeof(struct sockaddr);

    cout << "Binding a Socket\n";
    if((bind(sock, (struct sockaddr *)&server, sock_len)) == -1)
    {
        perror("Bind: ");
        close(sock);
        exit(-1);
    }

    cout << "Listening\n";
    if((listen(sock, 5)) == -1)
    {
        perror("Listen: ");
    }

    //To accept connection and get data from server

    while(1)
    {
        cout << "Waiting...";
        if((cli = accept(sock, (struct sockaddr *)&client, &sock_len )) == -1)
        {
            perror("Accept: ");
            close(sock);
            exit(-1);
        }
        else
        {
            cout << "Server: Got connection from " << inet_ntoa(client.sin_addr) << endl;

            file_size = recv(cli, fname, 100, 0);
            cout << "\nOpening file\n";
            fout.open(fname, ios::out | ios::app | ios::binary);
            if(!fout)
            {
                cout << "Error opening the file " <<fname << endl;

                close(sock);
                exit(1);
            }
        }
        cout << "Start now\n";
        //while((recv(cli, send_buffer, sizeof(send_buffer), 0)) != EOF)
        //while(*send_buffer != EOF)
        while(strcmp(send_buffer, "_EOF_") != 0)
        {
            recv(cli, send_buffer, 10, 0);
            cout << "Receiving Msg...";
            fout.write(send_buffer, sizeof(send_buffer));
            /*if(*send_buffer == EOF)   {
                cout << "Data Received\n";
                close(sock);
                break;

            }*/
        }
        //fout.write(EOF, sizeof(EOF));
        /*if(read_size == 0)
        {
            cout << "Client Disconnected";
        }
        else if(read_size == -1)
        {
            perror("Receive Failed");
            close(sock);
        }*/
        //  fout.write(eof, sizeof(eof()));
        fout.close();


    }
    close(sock);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv)
{
int-sock,cli,读取大小,文件大小;//cli套接字描述符
服务器、客户端中的结构sockaddr_;
字符*发送缓冲区;
char*fname;
无符号整数sock_len;
流式流量计;

cout分段错误表示程序正在访问不允许其访问的内存位置。这通常意味着您有未正确初始化的指针或指向已返回操作系统的内存块的指针

在使用它们之前,必须为
send_buff
buf_msg
分配内存

void*malloc(大小)

分配内存块

分配一个大小为字节的内存块,返回指向该块开头的指针

比如:

char *send_buff = malloc(1024);
char *buf_msg = malloc(1024);

buf_msg
在哪里初始化?可能不相关,但是.buf_msg主要在那里初始化。他还必须修复使用
sizeof(buf_msg)
sizeof(send_buffer)
的方式。这两种方式总是给出任何指针的大小,而不是缓冲区的字节数。
char *send_buff = malloc(1024);
char *buf_msg = malloc(1024);