07-06-2011 06:47 AM
Hi All,
From below threads I just came to know that there is no port-maper service on NI-VISA client hence I have implemented the raw socket for the same.
I am able to establish interrupt channel with NI-Max client but still I am not getting VI_EVENT_SERVICE_REQ event at client side and viWaitonEvent() function giving timeout.
Might be there is some issue with new defined RPCHDR structure!!
I never done Network programing before. Please guide; how to resolve this issue.
client Socket Code:-
typedef struct rcphdr{
unsigned int length;
unsigned int xid;
unsigned int msg_type;
unsigned int rpcvers;
unsigned int prog;
unsigned int vers;
unsigned int proc;
unsigned int auth[4];
}RPCHDR;
typedef struct DeviceSrqParms {
struct {
u_int handle_len;
char handle_val[40];
}handle;
}DeviceSrqParms;
typedef struct intr_srq_data
{
RPCHDR tdsRPC_Header;
DeviceSrqParms tdsDevSrqData;
}intrsrqData;
static SOCKET ConnectSocket;
struct sockaddr_in clientService;
WSADATA wsaData;
intrsrqData SrqMsgStruct;
unsigned int toBigEndian(unsigned int val)
{
if(!isBigEndian())
{
return htonl(val);
}
return val;
}
create_intr_chan_1_svc(Device_RemoteFunc *argp, struct svc_req *rqstp)
{
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
printf("Error at WSAStartup()\n");
ConnectSocket = socket(PF_INET, SOCK_STREAM,0);
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
clientService.sin_port = htons(argp->hostPort);
if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return;
}
#endif
}
device_enable_srq_1_svc(Device_EnableSrqParms *argp, struct svc_req *rqstp)
{
static unsigned int ui32XId = 1;
std::string handle = std::string(argp->handle.handle_val, argp->handle.handle_len);
unsigned int ui32Length = (sizeof( RPCHDR ) - 4) | 0x80000000;
SrqMsgStruct.tdsRPC_Header.length = toBigEndian(ui32Length);
SrqMsgStruct.tdsRPC_Header.xid = toBigEndian(1);
SrqMsgStruct.tdsRPC_Header.msg_type = toBigEndian(0);
SrqMsgStruct.tdsRPC_Header.rpcvers = toBigEndian(2);
SrqMsgStruct.tdsRPC_Header.prog = toBigEndian(DEVICE_INTR);
SrqMsgStruct.tdsRPC_Header.vers = toBigEndian(DEVICE_INTR_VERSION);
SrqMsgStruct.tdsRPC_Header.proc = toBigEndian(device_intr_srq);
memset(SrqMsgStruct.tdsRPC_Header.auth, 0, sizeof(SrqMsgStruct.tdsRPC_Header.auth));
//Append stored SRQ data
strcpy(SrqMsgStruct.tdsDevSrqData.handle.handle_val,handle.c_str());
SrqMsgStruct.tdsDevSrqData.handle.handle_len = toBigEndian(VxiIOConst::Handle.mHandleLen);
//TCP Socket accept data as std::string, so convert data structure to std::string
char *pcData = (char *) &SrqMsgStruct;
int iResult = send( ConnectSocket, pcData, sizeof(INTR_SRQ_DATA), 0 );
}
System Info:-
Operating System(OS) Microsoft Windows XP Professional
OS Version 5.01.2600
OS Info Service Pack 3
Processor Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz / x86 Family 6 Model 23 Stepping 10 / GenuineIntel / 2992 MHz
Number of Processors 2
Physical Memory 1.85 GB of RAM
Drive C:\ 72.4 GB of 97.6 GB free
Drive E:\ 115 GB of 135 GB free
National Instruments Software: Version:
CVI Run-Time 9.0.0.353
LabVIEW Run-Time 8.2.1
Measurement & Automation Explorer 4.5.0.49152
NI-PAL Software 2.4.0
NI Spy 2.6.0.49152
NI-VISA 4.5
NiVisaServer.exe 4.5.0.49152
NIvisaic.exe 4.5.0.49152
NI-VISA Runtime 4.5
Thanks
07-06-2011 10:29 AM
Hi C++Coder,
You don't have to send back the package in function device_enable_srq_1_svc, you only store the package in memory and also detect it is send by the system with what Endian (Big or Little). When the STB bit RQS (bit-6) raised (for testing you could simulate it), you send back the stored package in function as described in my thread with Endian handling, so it'll work for any system.