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
%}