【问题标题】:Segmentation fault when read char* using sockets使用套接字读取 char* 时出现分段错误
【发布时间】:2018-03-18 14:41:08
【问题描述】:

所以我正在用 C 编写一个应用程序客户端-服务器,客户端向服务器询问时间,服务器用它来响应。我正在使用结构做它。当我尝试从 client.c 中的服务器读取数据时出现分段错误。 我在 receiveTimeResponse 遇到分段错误并试图找出原因。我以为是因为我没有为 char* 日期分配内存,但我想我做到了。

结构:

struct timeStructQuer{
    int header[4];
    int requestID;
};

struct timeStructResponse{
    int header[4];
    int requestID;
    int length;
    char* date;
};

服务器:

int main()
{
    //connection here 
    struct queryStruct myStruct;
    read(client_sockfd, &myStruct, sizeof(myStruct));
    getCurrentTime(client_sockfd, myStruct);
}

void getCurrentTime(int client_sockfd, struct queryStruct str){
    int length;
    char* currentTime = malloc(sizeof(char) * 30);

    time_t rawtime;
    struct tm * timeinfo;
    time (&rawtime);
    timeinfo = localtime (&rawtime);
    length = sprintf (currentTime ,"%s", asctime (timeinfo));

    struct timeStructResponse response;
    response.date = malloc(sizeof(char) * length);
    response.header[0] = 1;
    response.header[1] = 0;
    response.header[2] = 0;
    response.header[3] = 2;
    response.requestID = str.requestID;
    response.length = length;
    response.date = currentTime;

    write(client_sockfd, &response, sizeof(response));
}

客户:

int main()
{
    //connection here
    sendTimeQuery(sockfd);
    receiveTimeResponse(sockfd);

    exit(0);
}

void sendTimeQuery(int sockfd){

    struct queryStruct myStruct;

    int randomN = rand();
    myStruct.header[0] = 0;
    myStruct.header[1] = 0;
    myStruct.header[2] = 0;
    myStruct.header[3] = 2;
    myStruct.requestID = randomN;

    write(sockfd, &myStruct, sizeof(myStruct));
}

void receiveTimeResponse(int sockfd){       
    struct timeStructResponse response;
    response.date = malloc(sizeof(char) * 30);
    printf("seg2");
    read(sockfd, &response, sizeof(response));
    printf("Current time: %s", response.date);
}

【问题讨论】:

    标签: c sockets segmentation-fault


    【解决方案1】:

    read(sockfd, &response, sizeof(response)); 将用无效值覆盖先前分配的response.data 指针。问题是你不能传输指针(实际上你可以但是指针值在另一边是无效的)。您需要传输他们指向的数据。所以写应该是这样的:

    /* TODO check write results... */
    write(client_sockfd, &response.header, sizeof(response.header));
    write(client_sockfd, &response.requestID, sizeof(response.requestID));
    write(client_sockfd, &response.length, sizeof(response.length));
    write(client_sockfd, response.date, response.length);
    

    并像这样阅读:

    /* TODO check read and malloc results, length, and date is properly null-terminated... */
    read(sockfd, &response.header, sizeof(response.header));
    read(sockfd, &response.requestID, sizeof(response.requestID));
    read(sockfd, &response.length, sizeof(response.length));
    response.date = (char *) malloc(response.length);
    read(sockfd, response.date, response.length);
    

    【讨论】:

    • 谢谢,太好了。
    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多