使用C linux中的命名管道将数据从客户端发送到服务器

时间:2014-03-24 05:20:22

标签: c linux

我正在尝试使用C linux中的命名管道将数据从客户端发送到服务器。我想发送3个东西(消息长度,消息类型和消息),我把它放在一个结构中,并将指向该结构的指针发送到服务器。但是只发送了消息长度,但其他两件事情都没有发送。

这是我的代码

//client.c
//header files
typedef struct msgclient
{
    int msglen;
    int msgtype;
    char cp[100];
}M1;
int main()
{
    M1 *m;
    int rdfd, wrfd, numread;
    int ans;
    m=malloc(sizeof(M1));
    do
    {
            printf("\nEnter message type\n1. YOU WANT TO ENTER DATA\n2. AUTOMATIC DATA\n3. EXIT\nENTER YOUR CHOICE\t");
            scanf("%d",&m->msgtype);

            switch(m->msgtype)
            {
                    case 1: //memset(buf,'\0',(strlen(buf)+1));
                            m->msgtype=1;
                            printf("\nEnter data\t");
                            getchar();
                            scanf("%s",&m->cp);
                            m->cp[strlen(m->cp)]='\0';
                            m->msglen=strlen(m->cp);

                            break;
                    case 2: m->msgtype=2;
                            strncpy(m->cp,"I am HERE!!",strlen("I am HERE!!"));
                            m->cp[strlen("I am HERE!!")]='\0';
                            m->msglen=strlen(m->cp);
                            break;
                    case 3: exit(0);
                    default:printf("\nINVALID CHOICE\nTRY AGAIN\n1. YES \n2. NO\n");
                            scanf("%d",&ans);
                            continue;

            }
            wrfd = open(NP1, O_WRONLY);
            numread=write(wrfd, m, sizeof(m));
            printf("\nno. of bytes SENT TO the SERVER = %d",numread);
            printf("\n%s",m->cp);
            printf("\n%d",m->msgtype);
            printf("\nSEND AGAIN\n1. YES \n2. NO\t");
            getchar();
            scanf("%d",&ans);
    }while(ans==1);

    return 0;
}

现在server.c

//server.c
//header files
typedef struct msgclient
{
    int msglen;
    int msgtype;
    char cp[100];
}M1;
int main()
{
    M1 *m;
    int rdfd, wrfd, ret_val, numread;
    int ans=1;
    m=malloc(sizeof(M1));
    ret_val = mkfifo(NP1,0666);

    if ((ret_val == -1) && (errno != EEXIST))
    {
            perror("Error creating the named pipe");
            exit (1);
    }
    ret_val = mkfifo(NP2, 0666);
    if ((ret_val == -1) && (errno != EEXIST))
    {
            perror("Error creating the named pipe");
            exit (1);
    }
    while(ans!=0)
    {
            rdfd = open(NP1, O_RDONLY);
            if((numread = read(rdfd, m, sizeof(m)))==0)
                    return 0;
            printf("\nno. of bytes read from the client = %d\n\n",numread);
            fputs(m->cp,stdout);
            //printf("message is %s",m->cp);
            printf("\nLENGTH = %d\nTYPE = %d\nMESSAGE IS %s \nRECEIVED BY SERVER\n",m->msglen,m->msgtype,m->cp);
            printf("\nSENT TO CLIENT\n");
    }
    return 0;
}

请帮帮我。 谢谢:)

2 个答案:

答案 0 :(得分:1)

概念性问题是您“将指向该结构的指针发送到服务器”。客户端和服务器具有不同的内存空间,并且它们不能共享指针。您需要发送结构本身。幸运的是,这几乎就是你在程序中所做的事情。

具体而言,麻烦在于:

M1 *m;
m=malloc(sizeof(M1));
.
.
.
numread=write(wrfd, m, sizeof(m));

参数m是正确的(它是结构体),但您应该将sizeof(m)更改为sizeof(*m),这样您就可以发送结构中的字节数。您当前的代码只发送指针所具有的字节数。您还需要更改服务器上相应read的缓冲区大小。

答案 1 :(得分:0)

您无法将指针发送到结构,因为它在接收过程中没有意义。由于这两个进程不共享内存在接收过程中会指向什么?

你需要发送整个结构sans指针。既然你有一个msglen字段,你可以使用它来告知接收进程后面跟着多少字节,它可以用它来读取一些变量。因此,读者将读取长度字段,然后根据长度在第二次读取时获取剩余的消息。