转自:http://aea.web.psi.ch/Urs_Rohrer/MyWeb/sample1.htm
The following program prints onto the screen a list of the DAC and ADC values of all devices (command = RALL) of a given beam line. You may run this program test by entering the command 'test Server_Name Port_ID'. It is also possible to redirect the generateded output list to a file by appending a third parameter to the command line [ >File_Name ].
/*=====================================================
| Demo program for remote CAMAC access via TCP/IP |
=====================================================*/
#ifdef WIN32
#include <windows.h>
#include <process.h>
#include <stddef.h>
#include <stdlib.h>
#include <winsock.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#include <time.h>
#include <ctype.h>
#include <io.h>
#include <share.h>
#include <fcntl.h>
#include <sys\stat.h>
#else /* Unix */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/shm.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <pthread.h>
#include <ctype.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#endif
#define MAXLEN 2048 /* max command buffer length */
#define BACKLOG 5 /* max outstanding connections */
#define FLAGS 0 /* flags argument, must be zero */
#ifdef WIN32
#define errno WSAGetLastError()
#else
#define closesocket close
#define SOCKET int
#endif
SOCKET l_socket;
int DataTransfer(char *command_s, char *r_buffer)
{
int count, z, status;
struct timeval timeout;
fd_set readfds;
int msecs = 4000;
count = send ( l_socket, command_s, strlen(command_s) + 1, FLAGS ); // zero-terminated
if ( count == -1)
{
printf ("** Error sending data **\n");
return 0;
}
z = 0;
while(1)
{
if (msecs > 0)
{
FD_ZERO(&readfds);
FD_SET(l_socket,&readfds);
timeout.tv_sec = msecs / 1000;
timeout.tv_usec = (msecs % 1000) * 1000;
status = select(FD_SETSIZE, &readfds, NULL, NULL, &timeout);
if (status == -1)
{
printf ("** Error while selecting **\n");
return 0;
}
if (!FD_ISSET(l_socket,&readfds))
{
printf ("** Timeout while selecting **\n");
r_buffer[z] = '\0'; // terminate it by adding a '\0'
z++;
break;
}
}
count = recv ( l_socket, &r_buffer[z], MAXLEN, FLAGS );
if ( count == -1 )
{
printf ("** Error receiving answer **\n");
return 0;
}
else
z += count;
if (r_buffer[z-1] == '\0') // termination has arrived
break;
}
return z;
}
void Display(void)
{
char buffer[MAXLEN];
char command[MAXLEN];
sprintf(command,"RALL");
DataTransfer(command,buffer);
/* reservation ok */
if ( buffer[7] != '0' )
{
printf("%s\n",&buffer[6]);
}
}
int main (int argc, char *argv[])
{
int status;
int shutdown_required = 0;
char localhost_s[20];
char remothost_s[20];
struct sockaddr_in l_socket_s;
struct sockaddr_in r_socket_s;
struct hostent *localhost_p;
struct hostent *remothost_p;
unsigned long non_blocking = 1 ;
unsigned long blocking = 0 ;
struct timeval timeout;
fd_set readfds, writefds;
int msecs = 4000;
int error=0, len;
#ifdef WIN32
WORD wVersionRequested;
WSADATA wsaData;
int err;
#else
typedef struct sockaddr *LPSOCKADDR;
#endif
/* Check argument list length */
if (argc != 3)
{
printf("Usage: client Servername ServerPort\n");
exit(1);
}
/* Start WinSocket-DLL */
#ifdef WIN32
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if (err != 0)
{
printf ("** WinSocket-DLL not found **\n");
exit(1);
}
#endif
/* Create a socket */
l_socket = socket ( AF_INET, SOCK_STREAM, 0 );
if ( l_socket == -1 )
{
printf ("** Error Creating Socket **\n");
exit(1);
}
/* Get hostname */
gethostname(localhost_s,sizeof(localhost_s));
localhost_p = gethostbyname ( localhost_s );
if ( localhost_p == NULL )
{
printf ("** Cannot get hostaddress of %s **\n",localhost_s);
exit(1);
}
/* bind socket to port */
l_socket_s.sin_family = AF_INET;
l_socket_s.sin_port = htons ( 0 );
l_socket_s.sin_addr.s_addr = 0;
memcpy((char*)&(l_socket_s.sin_addr), localhost_p->h_addr, localhost_p->h_length);
status = bind ( l_socket, (LPSOCKADDR)&l_socket_s, sizeof(l_socket_s));
if ( status == -1 )
{
printf ("** Error Binding Socket, errno = %d **\n",errno);
shutdown ( l_socket , 2 );
exit(1);
}
/* Get Server name */
strcpy(remothost_s,argv[1]);
remothost_p = gethostbyname ( remothost_s );
if ( remothost_p == NULL )
{
printf ("** Cannot get remote address %s **\n", remothost_s);
exit(1);
}
/* Connect to Server socket */
r_socket_s.sin_family = AF_INET;
r_socket_s.sin_port = htons ( (unsigned short)atol(argv[2]) );
r_socket_s.sin_addr.s_addr = *(unsigned long *) *(remothost_p->h_addr_list);
/*
non-blocking connect (in case server is not there
[e.g. power off]), see Stevens 2nd: /lib/connect_nob.c
*/
#ifdef WIN32
ioctlsocket(l_socket,FIONBIO,&non_blocking);
#else
ioctl(l_socket,FIONBIO,&non_blocking);
#endif
status = connect ( l_socket, (LPSOCKADDR)&r_socket_s, sizeof(r_socket_s));
if ( status == -1)
{
FD_ZERO(&readfds);
FD_SET(l_socket,&readfds);
writefds = readfds;
timeout.tv_sec = msecs / 1000;
timeout.tv_usec = (msecs % 1000) * 1000;
status = select(l_socket+1, (void *)&readfds, (void *)&writefds, NULL, (void *)&timeout);
if (status > 0 || status < 0)
{
if (FD_ISSET(l_socket,&readfds) || FD_ISSET(l_socket,&writefds))
{
len = sizeof(error);
if (getsockopt(l_socket, SOL_SOCKET, SO_ERROR, (char *)&error, &len) < 0)
goto error_ret;
}
else
goto error_ret;
if (error) goto error_ret;
#ifdef WIN32
status = ioctlsocket(l_socket,FIONBIO,&blocking);
#else
ioctl(l_socket,FIONBIO,&blocking);
#endif
}
else if (status == 0)
{
error_ret:
printf ("** Error connecting to Server **\n");
shutdown ( l_socket , 2 );
exit(1);
}
}
Display();
closesocket( l_socket );
exit(1);
return 0;
}