/* * udpclient.c - A simple UDP client * usage: udpclient */ #include #include #include #include #include #include #include #include #define BUFSIZE 1024 struct gretaCntlMsg { uint8_t version; /* protocol version */ uint8_t flags; /* for future use, e.g. for debugging */ uint8_t msg_type; /* reg_load=1, reg_dump=2, scalar_dump=3 */ uint8_t device; /* device id recognized by the electronics board */ uint16_t numEntries; /* number of address/value pairs */ uint16_t seqnum; /* sequence number */ int64_t timestamp; /* generated by trigger (10 nS clock) */ struct { uint32_t addr; uint32_t val; } av_pairs[1]; }; /* * error - wrapper for perror */ void error(char *msg) { perror(msg); exit(0); } int main(int argc, char **argv) { int sockfd, portno, n; int serverlen; struct sockaddr_in serveraddr; struct hostent *server; char *hostname; char buf[BUFSIZE]; unsigned long long addr; unsigned long long value; unsigned long long reg[3]; struct gretaCntlMsg msg; reg[0] = 0; /* check command line arguments */ if (argc != 5) { fprintf(stderr,"usage: %s \n", argv[0]); exit(0); } hostname = argv[1]; portno = atoi(argv[2]); addr = atol(argv[3]); value = atol(argv[4]); reg[1] = (addr<<32) + value; reg[0] = reg[1]; reg[2] = reg[1]; //printf("0x%016llX\n", addr); //printf("0x%016llX\n", value); //printf("0x%016llX\n", addr<<32); printf("0x%016llX\n", reg[1]); msg.version = 255; msg.flags = 2; msg.msg_type = 1; msg.device = 254; msg.numEntries = htons(1); msg.seqnum = htons(3); msg.timestamp = 0x123456789abcdef0; msg.av_pairs[0].addr = htonl(atol(argv[3])); msg.av_pairs[0].val = htonl(atol(argv[4])); /* socket: create the socket */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) error("ERROR opening socket"); /* gethostbyname: get the server's DNS entry */ server = gethostbyname(hostname); if (server == NULL) { fprintf(stderr,"ERROR, no such host as %s\n", hostname); exit(0); } /* build the server's Internet address */ bzero((char *) &serveraddr, sizeof(serveraddr)); serveraddr.sin_family = AF_INET; bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length); serveraddr.sin_port = htons(portno); /* get a message from the user */ //bzero(buf, BUFSIZE); //printf("Please enter msg: "); //fgets(buf, BUFSIZE, stdin); /* send the message to the server */ serverlen = sizeof(serveraddr); //n = sendto(sockfd, buf, strlen(buf), 0, &serveraddr, serverlen); //n = sendto(sockfd, ®, sizeof(reg), 0, &serveraddr, serverlen); n = sendto(sockfd, (void*)&msg, sizeof(msg), 0, (const struct sockaddr*)&serveraddr, serverlen); if (n < 0) error("ERROR in sendto"); /* print the server's reply */ // n = recvfrom(sockfd, buf, strlen(buf), 0, &serveraddr, &serverlen); // if (n < 0) // error("ERROR in recvfrom"); // printf("Echo from server: %s", buf); return 0; }