消息队列通信msgsnd函数时一直invalid argument

来源:互联网 发布:知乎 cos 编辑:程序博客网 时间:2024/04/30 06:45

这个问题困扰了我好长时间,郁闷死啦!先说说问题吧!

我是想建多个客户端让其与服务器进行通信,客户端程序如下:

#include <stdio.h>   
#include <fcntl.h>   
#include <stdlib.h>   
#include <string.h>   
#include <sys/types.h>   
#include <sys/ipc.h>   
#include <sys/msg.h>   
#include <sys/stat.h>   
  
#define BUF_SIZE    256   
#define PROJ_ID     32   
#define PATH_NAME   "/tmp"    
#define interver 5
  
int main(void)   
{   
  
/*用户自定义消息缓冲区*/  
struct mymsgbuf{   
    long msgtype;   
    char ctrlstring[BUF_SIZE];   
}msgbuffer;   
int qid;/*消息队列标识符*/  
int msglen;
int msg;
char username[20];
char password[20];
char names[][20]={"Beijing","ShangHai","Tianjin","Guangzhou","Wuhan"};
char passw[][20]={"123456","123456","123456","123456","123456"}; 
key_t msgkey;  
     while(1)
     {
     printf("Input username:");
     scanf("%s",username);
     fflush(stdin);
     printf("Input password:");
     scanf("%s",password); 
     fflush(stdin);
     for(msg=0;msg<5;msg++)
     {
       if(strcmp(username,names[msg])==0 && strcmp(password,passw[msg])==0)
       {
        printf("Welcome to the communication");
        break;
       }
     }
    if(msg<5){
      break;
      }
    else
       printf("wrong username or password/n");
   }

     /*获取键值*/  
    if ((msgkey = ftok(PATH_NAME,PROJ_ID)) == -1)   
    {   
      perror("ftok error!/n");   
      exit(1);   
    }   
  
    if ((qid = msgget(msgkey,IPC_CREAT|0660)) == -1)   
    {   
      perror("msgget error!/n");   
      exit(1);   
    }   

    while(1)   
    {   
      printf("%s:",names[msg]);   
      fgets(msgbuffer.ctrlstring,BUF_SIZE,stdin);   
      if (strncmp("exit",msgbuffer.ctrlstring,4) == 0)   
      {   
          break;   
      }   
  
      msgbuffer.ctrlstring[strlen(msgbuffer.ctrlstring)-1] = '/0';   
      msgbuffer.msgtype = msg;   
      if (msgsnd(qid,&msgbuffer,strlen(msgbuffer.ctrlstring) + 1,0) == -1)
      {
          perror("client msgsnd error!/n");   
          exit(1);   
      }  
 
     if (msgrcv(qid,&msgbuffer,BUF_SIZE,msg+interver,0) == -1)   
      /*if queue is empty, block here*/  
      {   
           perror("Server msgrcv error!/n");   
           exit(1);   
      }   
         
      printf("server: %s/n",msgbuffer.ctrlstring);   
    }   
   exit(0);   

 错误提示:client msgsnd  error!:invalid argument

在网上找了半天人家都说是msgsnd第三个参数是msgbuffer.ctrlstring不是整个msgbuffer的大小
第三个参数改成BUF_SIZE后server可以正常接收数据了!

经反复测试,还是不行,问题没能解决!想了半天后觉得应该是输入输出流的影响,就是换行符的问题!虽然我用了fflush(stdin),可是在gcc环境下这个函数的行为是不确定的。故而使用 fflush(stdin) 是不正确的,至少是移植性不好的。 fflush函数在vc6.0环境下是可以通过的!!!
经找资料后发现可以用

int c;

while ((c=getchar()) != '/n'&&c!=EOF) ;

这两条语句来读光缓冲区的数据!是程序得以顺序执行!

当时做这个程序时实验室又不能上网,在宿舍又没有gcc环境,反正那几天相当郁闷,希望对遇到此类问题的大家有所帮助!!!

原创粉丝点击