kim@CS.COLUMBIA.EDU (Taeyon Kim) (05/10/91)
Hi, I am a student in Columbia University doing a project in network management. We are using ASN.1 in protocol specifications and I was having a problem. We are using UDP socket to send a packet and string object Presentation Stream. I had a success with the full-duplex Presentation Stream object with the TCP, but I found it a problem with UDP because UDP needs to specify the sender's and receiver's address. When I used dbx, the buffer was still empty even after it was bound to PS. I will include my source code which contains the PEPY part in the following. It might be a simple problem. I will really appreciate your help. Thank you. ------------------------------- test.h ------------------------------------ typedef struct packetype { char *senderID; int packetID; int volume_num; int total_volume; int type; char *template_name; char *compileCmd; int length; char *body; } Packet ; -------------------- file test.py -------------------------------------------- MadPacket DEFINITIONS ::= %{ #include "MAD_PT_defs.h" #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PEPYPARM Packet * static char *myname = "MadPacket"; void adios (); void packet_send(); int packet_receive(); void packet_send (socket, testpacket, receiver_addr, maxaddrlen) int socket; Packet *testpacket; struct sockaddr receiver_addr; int maxaddrlen; { PE pe; PS ps; int stat; char buffer[2000]; int nbytes; int i; if (build_MadPacket_PacketPDU (&pe, 1, NULL, NULLCP, testpacket) == NOTOK) adios (NULLCP, "encoder fails"); bzero (buffer, 2000); if ( ( ps=ps_alloc(str_open)) == NULLPS ) Error("PEPY: Allocating presentation stream"); if ( (str_setup( ps, buffer, 2000 )) == NOTOK) Error("PEPY: Setting up full duplex file descriptor."); if ( pe2ps(ps,pe) == NOTOK ) Error("PEPY: Converting PE to PS"); /* for (i=0; i < 2000; i++) mesg[i]=mesg[i]+10; */ if (sendto(socket, buffer, 2000, 0, receiver_addr, maxaddrlen) != 2000) { Error("sendto"); exit(-1); } ps_free(ps); pe_free(pe); } int packet_receive(socket, testpacket, sender_addr, maxaddrlen) int socket; Packet *testpacket; struct sockaddr *sender_addr; int maxaddrlen; { PS ps2; PE pe2; int fromlen; int len; char buffer[2000]; fd_set readset; int i; bzero(buffer, 2000); FD_ZERO (&readset); FD_SET (socket, &readset); select (FD_SETSIZE, &readset, (fd_set *)0, (fd_set *)0, NULL); if (FD_ISSET (socket, &readset)) { fromlen = maxaddrlen; if ((len = recvfrom (socket, buffer, 2000, 0, sender_addr, &fromlen)) < 0) { Error("recvfrom"); exit(-1); } /* for (i=0; i<len; i++) mesg[i] = mesg[i] - 10; */ if ( ( ps2=ps_alloc(str_open)) == NULLPS ) Error("PEPY: Allocating presentation stream"); if ( (str_setup( ps2, NULLCP, len, 0)) == NOTOK) Error("PEPY: Setting up full duplex file descriptor."); pe2 = ps2pe(ps2); if (unbuild_MadPacket_PacketPDU(pe2, 1, NULLIP, NULLVP, testpacket) == NOTOK) adios (NULLCP, "decoder fails"); ps_free(ps2); pe_free(pe2); return (DONE); } ps_free(ps2); pe_free(pe2); return (NOT_READY); } %} BEGIN SECTIONS build unbuild none PacketPDU ::= SEQUENCE { senderID IA5String [[s parm->senderID]], packetID INTEGER [[i parm->packetID]], volumenum INTEGER [[i parm->volume_num]], total INTEGER [[i parm->total_volume]], command INTEGER [[i parm->type]], templatename IA5String [[s parm->template_name]], compileCmd IA5String [[ s parm->compileCmd ]], length INTEGER [[ i parm->length]], body OCTET STRING [[o parm->body $ parm->length]] } END %{ /* ERRORS */ #include <varargs.h> #ifndef lint void _advise (); static void adios (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); _exit (1); } #else /* VARARGS */ static void adios (what, fmt) char *what, *fmt; { adios (what, fmt); } #endif #ifndef lint static void advise (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); } static void _advise (ap) va_list ap; { char buffer[BUFSIZ]; asprintf (buffer, ap); (void) fflush (stdout); fprintf (stderr, "%s: ", myname); (void) fputs (buffer, stderr); (void) fputc ('\n', stderr); (void) fflush (stderr); } #else /* VARARGS */ static void advise (what, fmt) char *what, *fmt; { advise (what, fmt); } #endif %}