【问题标题】:csocket : segmentation fault while sending linked listcsocket:发送链表时出现分段错误
【发布时间】:2014-04-21 23:00:55
【问题描述】:

我想在c中的套接字编程中从客户端向服务器发送一个链表。请任何人帮助我。以下是链表中节点的结构。

struct node
{
    int data;
    struct node * next;
};

基本上我想将链表从客户端发送到服务器,然后希望服务器对链表进行排序并将其返回给客户端

客户端代码:

#define MAX 100
#define PORT 5000
#define SA struct sockaddr
struct node
{
    int data;
    struct node *next;
};

int main()
{

    struct node *a=NULL;
    a=(struct node *)malloc(sizeof(struct node *));

    int sockfd,connfd;
    struct sockaddr_in servaddr,cli;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        printf("socket creation failed...\n");
        exit(0);
    }
    else
        printf("Socket successfully created..\n");
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    servaddr.sin_port=htons(PORT);
    if(connect(sockfd,(SA *)&servaddr,sizeof(servaddr))!=0)
    {
        printf("connection with the server failed...\n");
        exit(0);
    }
    else
        printf("connected to the server..\n");

    printf("\nEnter the data");
    scanf("%d",&a->data);
    write(sockfd,&a,sizeof(a));
    printf("\ndata sent to the server");

    close(sockfd);
}

服务器代码:

#define MAX 100
#define PORT 5000
struct node
{
    int data;
    struct node *next;
};

int main()
{
    struct node *a=NULL;
    a=(struct node *)malloc(sizeof(struct node *));

    int sockfd,connfd,len;
    struct sockaddr_in servaddr,cli;
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    if(sockfd==-1)
    {
        printf("socket creation failed...\n");
        exit(0);
    }
    else
        printf("Socket successfully created..\n");
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(PORT);
    if((bind(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr)))!=0)
    {
        printf("socket bind failed...\n");
        exit(0);
    }
    else
        printf("Socket successfully binded..\n");
    if((listen(sockfd,5))!=0)
    {
        printf("Listen failed...\n");
        exit(0);
    }
    else
        printf("Server listening..\n");
    len=sizeof(cli);
    connfd=accept(sockfd,NULL,NULL);
    if(connfd<0)
    {
        printf("server acccept failed...\n");
        exit(0);
    }
    else
        printf("server acccept the client...\n");
    read(sockfd,&a,sizeof(a));
    printf("\ndata read from the client\n");
    printf("%d\n",a->data);
    close(sockfd);
}

我现在刚刚向链表添加了 1 个元素。 我能够解决分段错误,但我从客户端发送到服务器的值在服务器上接收错误。

【问题讨论】:

  • 如果您提供所有代码,将会很有帮助。如果您可以使用调试器逐步执行程序,以找出崩溃发生的位置,请将此信息添加到您的问题中。谢谢
  • 1) a=(struct node *)malloc(sizeof(struct node *)); 你为指针分配空间;你想要一个节点的空间。 2)write(sockfd,&amp;a,sizeof(a));你发指针;你想发送一个节点 3)你不能发送指针;它们指的是本地机器上的对象。
  • 你好先生..你能帮我怎么做..现在如何传递链接列表..我正在尝试更正..但仍然无法发送

标签: c list sockets send


【解决方案1】:

首先,来自客户端地址空间的指针值,即使在同一台机器上,在服务器端也没有任何意义,所以我建议只发送节点值。

然后,您需要检查 write()read() 的返回值 - 它们告诉您可以发送和接收多少字节。这里的根本问题是连接的 TCP 套接字为您提供了一个全双工 stream 字节,它对您的应用程序级“消息”一无所知。这意味着一个write() 可以对应多个read()s,反之亦然。

此外,根据上述内容,接收方需要知道预期有多少字节(或消息,如果它们具有已知大小)。在这个特定示例中,最简单的方法是在您的“列表”消息前面加上列表中的项目数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-18
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多