消息队列通信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环境,反正那几天相当郁闷,希望对遇到此类问题的大家有所帮助!!!
- 消息队列通信msgsnd函数时一直invalid argument
- 消息队列函数 msgsnd 出现Invalid argument错误的解决办法
- 消息队列工作机制 msgsnd: Invalid argument
- 消息队列工作机制 msgsnd: Invalid argument
- 消息队列工作机制 msgsnd: Invalid argument
- 进程消息缓冲通信 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)
- 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- linux进程间通信--消息队列相关函数(msgget、msgctl、msgsnd、msgrcv)详解
- 消息队列 (msgrcv, msgsnd)
- [Linux]解决msgsnd <Invalid argument>错误
- (转)linux消息队列函数 msgget,msgsnd, msgrcv, ftok()
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- linux消息队列函数msgget,msgsnd,_msgrcv,_ftok()
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例 .
- 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
- java keywods & reserved
- 学习C++和编程的50个观点
- Hibernate session浅见(3)
- Java多线程编程总结
- LDD3学习笔记《三》第四章
- 消息队列通信msgsnd函数时一直invalid argument
- 时间差计算方法
- 读书笔记之编程之美 - 1.1 让CPU占用率曲线听你指挥
- windows7家庭普通版,administrator账户找不到
- VB.NET 接收邮件并编码
- ZOJ 1243 URLs
- 自动在/dev/下创建设备文件
- 活到老学到老
- POJ 1365 Prime Land