C套接字编程

标签 c

我是 C 语言编程的新手。我尝试了基本的套接字编程。它运行良好,但我的问题是我创建了一个链表来存储发送和接收的消息。当我打印链表时,只显示发送的消息(ptr3->请求),而我收到的消息(ptr3->响应)是空的。

我认为参数的传递是我犯错误的地方。但是,在这两种情况下,我都只传递地址。我真的无法弄清楚错误。

代码片段:

#include<stdio.h>
#include<string.h>   
#include<sys/socket.h>
#include<arpa/inet.h> 
#include<time.h>
#include<errno.h>
#include<stdlib.h>

void create(char*,char*);
void insert(char*,char*);
void send_receive(char*,int);
void display();

struct packet_details
{
char *request;
char *response;
struct packet_details *next;
};

typedef struct packet_details details;
details *head = NULL ,*temp = NULL;

void create(char *send,char *receive)
{
    details *new_node;
    new_node= (details*)malloc(sizeof( details));

    if(NULL == new_node)
    {
        printf("Cannot allocate requested memory %d %s %s",__LINE__,__FILE__,__FUNCTION__);
    }

    else
    {
        new_node->request= send;
        new_node->response = receive;
        new_node->next = NULL;

        head = temp = new_node;
    }
}

void insert(char *send,char *receive)
{
    details *new_node;
    if(NULL == head)
    {
        create(send,receive);
        return;
    }
    new_node= (details*)malloc(sizeof( details));

        new_node->request = send;
        new_node->response = receive;
        new_node->next = NULL;

       temp->next = new_node;
       temp = new_node;
}

void display()
{
    details *ptr3;
    ptr3 = head;
    while(NULL != ptr3)
    {
        printf("\n**********************************\n");
        printf("\n**********************************\n");

        printf("\n%s",ptr3->request);
        printf("\n%s",ptr3->response);

        printf("\n***********************************\n");
        printf("\n***********************************\n");
        ptr3=ptr3->next;
    }
}

int main()
{
    int socket_desc,a=0;
    struct sockaddr_in server;
    char *message;

    //Create socket
    socket_desc = socket(AF_INET , SOCK_STREAM , 0);
    if (socket_desc == -1)
    {
        printf("Could not create socket! %s\n",strerror(errno));
    }

    server.sin_addr.s_addr = inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons(7887);

    //Connect to server
    if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        printf("connect error ! %s\n",strerror(errno));
        return 1;
    }

    puts("Connected\n");

    while(a < 5 )
    {
    printf("\nCLIENT:");
    message =  "Hello Server\n";
    printf("%s",message);
    send_receive(message,socket_desc);
    a++;

    sleep(10);

    printf("\nCLIENT:");
    message =  "How are you?\n";
    printf("%s",message);
    send_receive(message,socket_desc);
    a++;

    sleep(10);

    printf("\nCLIENT:");
    message =  "Are you busy?\n";
    printf("%s",message);
    send_receive(message,socket_desc);
    a++;

    sleep(10);

    printf("\nCLIENT:");
    message =  "Process my request\n";
    printf("%s",message);
    send_receive(message,socket_desc);
    a++;

    sleep(10);

    printf("\nCLIENT:");
    message =  "Bye\n";
    printf("%s",message);
    send_receive(message,socket_desc);
    a++;
    }

    close(socket_desc);
    return 0;
}


 void send_receive(char *msg,int socket_desc)
    {
    char server_reply[2000];
    char *reply;
    if(write(socket_desc,msg,strlen(msg))<0)
    {
    printf("\n data could not be sent");
    }
    read(socket_desc,server_reply,sizeof(server_reply));
    printf("server:%s",server_reply);
    reply = &server_reply[0];
    insert(msg,reply);  /* passing of two addresses as arguments */
}

有人能帮帮我吗?

最佳答案

每次调用 insert 时,都会传入在堆栈上分配的缓冲区地址,即 server_reply,并将其保存在列表中。然后,当 send_receive 存在时,该内存指向垃圾。

而不是这样做:

new_node->request= send;
new_node->response = receive;

这样做:

new_node->request= strdup(send);
new_node->response = strdup(receive);

这会在新分配的缓冲区中复制发送/接收的数据。清理时请确保 free() 所有内存。

关于C套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31274676/

相关文章:

c++ - 使用 %c 扫描整数,使用 %d 扫描字符 : unexpected results

c - 1.7 K&D书的功能。当 p 声明为 1 时如何计算 2^0

c - 是否可以在不使用移位或异或的情况下找到 x86 中数字的最小值/最大值?

c++ - 通过引用传递参数到底是什么?

c - 在 C 编程中使用数组、循环和条件

c - 格式化字符串漏洞利用——打开 root shell

c - 带有套接字的C服务器/客户端

c++ - #define Dbg(fmt,…)(0)是什么意思?警告:表情无效

c - 如何覆盖每个符号 NASM 中的 `--prefix` 选项?

c - 这是创建双向链表的有效方法吗?