Msgrcv 不接收消息,但是它们已正确发送
Msgrcv does not receive messages however they have been sent properly
我正在编写一个基本的服务器程序,它必须从客户端接收两种类型的消息(第一种消息是类型 1,第二种消息是类型 2)。似乎它没有看到来自已正确发送的客户端的消息(msgsnd 没有 return -1)。我读到它可能是由消息太大引起的,但我的消息就像几个字符一样长,我的缓冲区是 100。我没有发现我创建的结构有任何差异,msgget 也没有 return 任何错误。这是服务器程序代码:
struct msgbuf
{
long type;
char text[100];
}m1;
int main()
{
int id;
if (id = msgget(1998,0666|IPC_EXCL)==-1) {
printf("msgget error");
}
char first_msg[100][100];
char second_msg[100][100];
int counter = 0;
while (counter < 100) {
msgrcv(id,&m1,sizeof(m1.text),1,0);
printf("%s",m1.text);
strcpy(first_msg[counter], m1.text);
msgrcv(id,&m1,sizeof(m1.text),2,0);
printf("%s",m1.text);
strcpy(second_msg[counter],m1.text);
counter++;
}
return 0;
}
和一个客户代码:
struct msgbuf
{
long type;
char text[100];
};
int main()
{
struct msgbuf m1,m2;
int id;
if ((id = msgget(1998,0666|IPC_EXCL)) == -1) {
printf("error");
}
char first_msg[90];
scanf("%s",&first_msg[0]);
char second_msg[90];
scanf("%s",&second_msg[0]);
m1.type = 1;
strcpy(m1.text,first_msg);
if (msgsnd(id,&m1,sizeof(m1.text),0) == -1) {
perror("msgsnd failed");
}
m2.type = 2;
strcpy(m2.text,second_msg);
if (msgsnd(id,&m2,sizeof(m2.text),0)==-1) {
perror("msgsnd2 failed");
}
return 0;
}
这是一个由运算符优先级问题引起的严重错误。
在客户端,你写对了:
if ((id = msgget(1998,0666|IPC_EXCL)) == -1) {
和 parens 确保您首先分配给 id
然后比较 -1.
但是在服务器中,你只有:
if (id = msgget(1998,0666|IPC_EXCL)==-1) {
不幸的是它实际上读取 if (id = (msgget(1998,0666|IPC_EXCL)==-1))
,因为比较的优先级高于赋值!
修复很简单:只需在 server.c 中添加括号,就像它们在 client.c
中一样
我正在编写一个基本的服务器程序,它必须从客户端接收两种类型的消息(第一种消息是类型 1,第二种消息是类型 2)。似乎它没有看到来自已正确发送的客户端的消息(msgsnd 没有 return -1)。我读到它可能是由消息太大引起的,但我的消息就像几个字符一样长,我的缓冲区是 100。我没有发现我创建的结构有任何差异,msgget 也没有 return 任何错误。这是服务器程序代码:
struct msgbuf
{
long type;
char text[100];
}m1;
int main()
{
int id;
if (id = msgget(1998,0666|IPC_EXCL)==-1) {
printf("msgget error");
}
char first_msg[100][100];
char second_msg[100][100];
int counter = 0;
while (counter < 100) {
msgrcv(id,&m1,sizeof(m1.text),1,0);
printf("%s",m1.text);
strcpy(first_msg[counter], m1.text);
msgrcv(id,&m1,sizeof(m1.text),2,0);
printf("%s",m1.text);
strcpy(second_msg[counter],m1.text);
counter++;
}
return 0;
}
和一个客户代码:
struct msgbuf
{
long type;
char text[100];
};
int main()
{
struct msgbuf m1,m2;
int id;
if ((id = msgget(1998,0666|IPC_EXCL)) == -1) {
printf("error");
}
char first_msg[90];
scanf("%s",&first_msg[0]);
char second_msg[90];
scanf("%s",&second_msg[0]);
m1.type = 1;
strcpy(m1.text,first_msg);
if (msgsnd(id,&m1,sizeof(m1.text),0) == -1) {
perror("msgsnd failed");
}
m2.type = 2;
strcpy(m2.text,second_msg);
if (msgsnd(id,&m2,sizeof(m2.text),0)==-1) {
perror("msgsnd2 failed");
}
return 0;
}
这是一个由运算符优先级问题引起的严重错误。
在客户端,你写对了:
if ((id = msgget(1998,0666|IPC_EXCL)) == -1) {
和 parens 确保您首先分配给 id
然后比较 -1.
但是在服务器中,你只有:
if (id = msgget(1998,0666|IPC_EXCL)==-1) {
不幸的是它实际上读取 if (id = (msgget(1998,0666|IPC_EXCL)==-1))
,因为比较的优先级高于赋值!
修复很简单:只需在 server.c 中添加括号,就像它们在 client.c
中一样