csocket:发送链表时出现分段错误

时间:2014-03-16 20:28:02

标签: c list sockets send

我想在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 个答案:

答案 0 :(得分:3)

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

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

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