关于 udp 通信的问题

各位好,

我在vmvare 上面虚拟了两个qnx6.3的os. 我想用udp在两个nodes之间通讯,但是碰到一个问题:node1 向node2传送数据没有问题,可是反过来就行不通。
我的设想是在每一个node上面分别创建两个socket fd, 使得这两个nodes在通信的时候互为server and client. 当我试图在一个node上面对两个sockfd进行bind时.其中的一个node没有问题,但是另一个在bind remote sockaddr时提示“can’t assign requested address”。

请问有人知道怎么回事吗?
下面再分别贴出代码

/* File: server.c */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <spawn.h>
#include <errno.h>
#include <unistd.h>
#include <sys/select.h>
#include “Communication.h”

double number = 1.0;
int fdc,fds;
struct sockaddr_in addr,c_addr;
socklen_t len = sizeof(addr);


void SumRecvfromGain()
{
char buf[30]="";
printf(“before sum receive…\n”);
recvfrom(fdc, buf, 30, 0, (struct sockaddr *)&c_addr, &len);
printf("\n: Sum Received data: %s \n",buf);
number = atof(buf);
}

void SumSendtoGain(double temp)
{
char buf[30]= “”;
int n = 0;
printf(“before sum sends…\n”);
sprintf(buf, “%f”, temp);
if ((n=sendto(fdc, buf, strlen(buf)+1, 0, (struct sockaddr *)&c_addr, sizeof(c_addr)))<0 )
{
printf(“Sum sends to Gain error\n”);
}
printf(" Sum sended %s\n",buf);

}

int main(int argc, char **argv)
{

int n;
pid_t pid;
int ret;
int on = 1;

fds = socket(AF_INET, SOCK_DGRAM, 0); //SOCK_DGRAM
fdc = socket(AF_INET, SOCK_DGRAM, 0);

setsockopt(fds, SOL_SOCKET,SO_REUSEADDR,&on, sizeof(on));

bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(GainSumPort);

ret = bind(fds, (struct sockaddr *)&addr, sizeof(addr));
printf(“Sum subsystem bind local %d\n”,ret);
if(ret < 0) printf("%s\n", strerror(errno));


bzero(&c_addr, sizeof(c_addr));
c_addr.sin_family = AF_INET;
c_addr.sin_addr.s_addr = inet_addr(Node2_IP);
c_addr.sin_port = htons(SumGainPort1);

struct inheritance inherit_Gain;
char *file_Gain="/home/filter/Gain";
char *Gain_arg_list[] = {file_Gain, NULL};
inherit_Gain.flags = SPAWN_SETND|SPAWN_NOZOMBIE;
inherit_Gain.nd = netmgr_strtond(“node2”,NULL);

if(pid = spawn(file_Gain,0,NULL,&inherit_Gain ,Gain_arg_list,NULL) == -1)
{
printf(“spawn error!”);
exit(-1);
}

while(LoopNumber–)
{
SumRecvfromGain();
SumSendtoGain(number);
} //end while
return 0;
}

/******************* file: Client.c (Gain)******************/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include “Communication.h”


int fdc,fds;

struct sockaddr_in remote_addr,local_addr;
socklen_t len = sizeof(remote_addr);
double number = 1.0;


void GainSendtoSum(double temp)
{
char buf[30]= “”;
int n = 0;
printf(“before Gain sends…\n”);
sprintf(buf, “%f”, temp);
if ((n=sendto(fds, buf, strlen(buf)+1, 0, (struct sockaddr *)&remote_addr, sizeof(remote_addr)))<0 )
{
printf(“Gain sends to Sum error\n”);
printf("%s\n", strerror(errno));
}
printf(" Gain sended %s\n",buf);
}

void GainRecvfromSum()
{
char buf[30]="";
int n;
printf(“before Gain receives…\n”);
n = recvfrom(fds, buf, 30, 0, (struct sockaddr *)&remote_addr, &len);
printf("\n: Gain Received %d data: %s \n",n,buf);
number = atof(buf);
number = number + 0.1;
}

int main(int argc, char **argv)
{
fds = socket(AF_INET, SOCK_DGRAM, 0);
fdc = socket(AF_INET, SOCK_DGRAM, 0);
int ret;


bzero(&remote_addr, sizeof(remote_addr));
remote_addr.sin_family = AF_INET;
remote_addr.sin_addr.s_addr = inet_addr(Node1_IP);
remote_addr.sin_port = htons(GainSumPort);

bzero(&local_addr, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(SumGainPort1);

ret = bind(fds, (struct sockaddr *)&local_addr, sizeof(local_addr));
if(ret < 0) printf("%s\n", strerror(errno));

while(LoopNumber–)
{
GainSendtoSum(number);
GainRecvfromSum();
}
return 0;
}

用透明分布式处理就可以了吧。也就是启动io-net的时候把qnet运行起来。那用自己写这么麻烦。

http://www.qnx.co.jp/developers/docs/6.3.2/neutrino/user_guide/qnet.html

在spawn()前,做一个 chroot("/net/node2"); 试试。