Rev 1405 |
Go to most recent revision |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
/*
* Project: S.Ha.R.K.
*
* Coordinators:
* Giorgio Buttazzo <giorgio@sssup.it>
* Paolo Gai <pj@gandalf.sssup.it>
*
* Authors :
* Paolo Gai <pj@gandalf.sssup.it>
* (see the web pages for full authors list)
*
* ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy)
*
* http://www.sssup.it
* http://retis.sssup.it
* http://shark.sssup.it
*/
/*
* Copyright (C) 2000 Luca Abeni, Paolo Gai
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
* CVS : $Id: aster1.c,v 1.1 2002/10/28 08:13:37 pj Exp
This is the talkdx.c Hartik's example.
File: Talk.C
Revision: 1.00
Author: Luca Abeni
Simple Netlib demo: nothing of seriously real-time, only another Unix
Talk clone.
Read it to see how the UDP/IP layers of the networ library work.
*/
#include <kernel/kern.h>
#include <string.h>
#include <drivers/crtwin.h>
#include <drivers/shark_keyb26.h>
#include <drivers/udpip.h>
WIN dbg
;
BYTE esc
= FALSE
;
char talk_myipaddr
[20];
char talk_toipaddr
[20];
/*
This non real-time task reads UDP packets from the network and writes
them in a window
*/
TASK scrittore
(void)
{
char str
[2000];
UDP_ADDR from
, local
;
WIN displ
;
int s
,n
;
/* Connect on the local port #100 */
local.
s_port = 100;
s
= udp_bind
(&local
, NULL
);
/* Open the window */
win_init
(&displ
,0,0,79,6);
win_frame
(&displ
,BLACK
,WHITE
,"Remote",2);
while (1) {
/* Clear the buffer for receiving the packet...*/
memset(str
, 0, 1999);
/*...and receive the packet (block until a packet arrives */
n
= udp_recvfrom
(s
, str
, &from
);
win_puts
(&displ
, str
);
}
}
/*
This non real-time task reads strings from the keyoard and sends them
to the remote host
*/
TASK write
(void)
{
WIN wr
;
UDP_ADDR to
,local
;
char str
[80],tmp
[5],ch
;
int s
;
IP_ADDR bindlist
[5];
win_init
(&wr
,0,7,79,6);
win_frame
(&wr
,BLACK
,WHITE
,"Local",2);
/* Create a socket for transitting */
ip_str2addr
(talk_myipaddr
,&(local.
s_addr));
local.
s_port = 101;
/*
If we want the address of the remote host in the ARP table before
begginning the transmission (to eliminate a possible source of
unpredictability), we can use the bindlist, otherwise we set the
second parameter of udp_bind to NULL
*/
ip_str2addr
(talk_toipaddr
,&(bindlist
[0]));
memset(&(bindlist
[1]), 0, sizeof(IP_ADDR
));
s
= udp_bind
(&local
, /*bindlist*/NULL
);
ip_str2addr
(talk_toipaddr
,&(to.
s_addr));
to.
s_port = 100;
sprintf(str
,"Local IP address %d.%d.%d.%d\n", local.
s_addr.
ad[0],
local.
s_addr.
ad[1], local.
s_addr.
ad[2],
local.
s_addr.
ad[3]);
win_puts
(&dbg
,str
);
sprintf(str
,"Talk to %d.%d.%d.%d ",to.
s_addr.
ad[0],to.
s_addr.
ad[1],
to.
s_addr.
ad[2],to.
s_addr.
ad[3]);
win_puts
(&dbg
,str
);
while (1) {
/* Get the string...*/
while((ch
= keyb_getch
(BLOCK
)) != 13) {
sprintf(tmp
,"%c",ch
);
strcat(str
,tmp
);
win_puts
(&wr
,tmp
);
}
strcat(str
,"\n");
win_puts
(&wr
,"\n");
/*...and send it!!! */
udp_sendto
(s
,str
,strlen(str
)+2,&to
);
str
[0] = 0;
}
}
/* This function is called when the user presses CTRL-C (stops the systems) */
void esci
(KEY_EVT
*k
)
{
esc
= TRUE
;
sys_end
();
}
int main
(int argc
, char **argv
)
{
KEY_EVT k
;
struct net_model m
= net_base
;
NRT_TASK_MODEL m_nrt
;
k.
flag = CNTL_BIT
;
k.
scan = KEY_C
;
k.
ascii = 'c';
k.
status = KEY_PRESSED
;
keyb_hook
(k
,esci
,FALSE
);
k.
flag = CNTR_BIT
;
k.
scan = KEY_C
;
k.
ascii = 'c';
k.
status = KEY_PRESSED
;
keyb_hook
(k
,esci
,FALSE
);
clear
();
cprintf
(" S.Ha.R.K. Talk! Ver. 1.10\n");
if (argc
!= 3) {
cprintf
("S.Ha.R.K. Talk usage: talk fromIP toIP\n");
return 0;
}
strcpy(talk_myipaddr
, argv
[1]);
strcpy(talk_toipaddr
, argv
[2]);
/* We want a task for TX mutual exclusion */
net_setmode
(m
, TXTASK
);
/* We use UDP/IP stack */
net_setudpip
(m
, talk_myipaddr
, "255.255.255.255");
/* OK: let's start the NetLib! */
if (net_init
(&m
) == 1) {
cprintf
("Net Init OK...\n");
} else {
cprintf
("Net Init Failed...\n");
sys_abort
(300);
}
//dump_irq();
cprintf
("\n\n\n\tPress ENTER\n");
while (!esc
) {
keyb_getcode
(&k
,BLOCK
);
if (k.
ascii == 13) esc
= TRUE
;
}
esc
= FALSE
;
clear
();
win_init
(&dbg
,0,20,60,3);
win_frame
(&dbg
,BLACK
,WHITE
,"Debug",2);
/* Start the sender and receiver tasks...*/
nrt_task_default_model
(m_nrt
);
task_activate
(task_create
("aaa",scrittore
,&m_nrt
,NULL
));
task_activate
(task_create
("bbb",write
,&m_nrt
,NULL
));
return 0;
}