Im Beispielprogramm verwendet der Client die folgenden Funktionen der Socket-Schnittstelle:
getbcamhost(): BCAM-Hostnamen abfragen
socket(): Socket erzeugen
bind(): dem Socket einen Namen zuordnen
connect(): auf einem Socket eine Verbindung anfordern
send(): Daten auf einen Socket schreiben
soc_close(): Socket schließen
Beispiel: Verbindungsorientierter Client bei AF_ISO
/*
* Beispiel: ISO CLIENT
*
* DESCRIPTION
* 1. getbcamhost - socket - bind - connect
* 2. send
* 3. soc_close
*/
#include <stdio.h>
#include <sys.types.h>
#include <sys.socket.h>
#include <iso.h>
#include <netinet.in.h>
#include <netdb.h>
#define INT 5
#define MAXREC 1000000
#define MAXTSEL 32
#define MAXNSEL 9
main(argc, argv)
int argc;
char *argv[];
{
void error_exit();
int sockfd, ret, lng;
int tsellen, nsellen, par_tsellen, par_nsellen;
char tsel[MAXTSEL];
char par_tsel[MAXTSEL];
char nsel[MAXNSEL];
char par_nsel[MAXNSEL];
char buffer [MAXREC];
struct sockaddr_iso cli_addr, serv_addr;
lng = 1024 ;
strcpy (tsel,"CLIENT");
tsellen = strlen(tsel);
strcpy (par_tsel,"SERVER");
par_tsellen = strlen(par_tsel);
nsel[MAXNSEL-1] = '\0';
/* Partner Host-Name besorgen */
if (argc > 1)
{
strcpy (par_nsel,argv[1]);
if ((par_nsellen = strlen(par_nsel)) != MAXNSEL - 1)
{
printf ("Fehler: Falscher Rechnername!!\n");
exit (-1);
}
}
else
{
printf ("Partner Host-Name wurde nicht als Argument in der
Kommandozeile uebergeben!\n");
exit (-1);
}
/* BCAM Host-Name besorgen */
errno = 0;
if (getbcamhost(nsel,sizeof(nsel)) < 0)
error_exit("ISO_cli: getbcamhost failed ",errno);
else
printf ("getbcamhost OK! (%s)\n",nsel);
nsellen = strlen(nsel);
/* Socket erzeugen */
errno = 0;
if ((sockfd = socket(AF_ISO, SOCK_STREAM, 0)) < 0)
error_exit("ISO_cli: Socket Creation failed ",errno);
else
printf ("socket OK!\n");
/* Dem Socket einen Namen zuordnen */
memset ((char *) &cli_addr, 0, sizeof(cli_addr));
cli_addr.siso_len = sizeof (struct sockaddr_iso);
cli_addr.siso_family = AF_ISO;
cli_addr.siso_plen = 0;
cli_addr.siso_slen = 0;
cli_addr.siso_tlen = tsellen;
cli_addr.siso_addr.isoa_len = tsellen + nsellen;
memcpy (cli_addr.siso_addr.isoa_genaddr,nsel,nsellen);
memcpy (cli_addr.siso_addr.isoa_genaddr + nsellen,tsel,tsellen);
memset ((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.siso_len = sizeof (struct sockaddr_iso);
serv_addr.siso_family = AF_ISO;
serv_addr.siso_plen = 0;
serv_addr.siso_slen = 0;
serv_addr.siso_tlen = par_tsellen;
serv_addr.siso_addr.isoa_len = par_tsellen + par_nsellen;
memcpy (serv_addr.siso_addr.isoa_genaddr,par_nsel,par_nsellen);
memcpy (serv_addr.siso_addr.isoa_genaddr +
par_nsellen,par_tsel,par_tsellen);
errno = 0;
if (bind (sockfd, (struct sockaddr_iso *) &cli_addr, sizeof(cli_addr)) < 0)
error_exit("ISO_cli: Bind failed ",errno);
else
printf ("bind OK!\n");
/* Verbindung starten */
errno = 0;
if (connect (sockfd, (struct sockaddr_iso *) &serv_addr,
sizeof(serv_addr)) < 0)
error_exit("ISO_cli: Connect failed ",errno);
else
printf ("connect OK!\n");
sleep(2);
/* Daten auf den Socket schreiben */
ret = send (sockfd, buffer, lng, 0);
if (ret == -1)
error_exit("ISO_cli: Send in Error", errno);
else
printf ("send OK!(%d)\n",ret);
/* Socket schliessen */
sleep (2);
errno = 0;
if (soc_close (sockfd) <0)
error_exit("Tcp_svr: soc_close failed ",errno);
else
printf ("soc_close OK!\n");
} /* END MAIN */
void
error_exit(estring,erno)
char *estring;
int erno;
{
fprintf(stderr,"%s errno=%d\n",estring,erno);
perror (estring);
exit(erno);
}
Im Programm werden folgende Arbeitsschritte durchgeführt:
- Der Client besorgt sich aus dem Kommandozeilen-Argument argc der main()-Funktion den Namen des Partner-Host.
Mit der Funktion getbcamhost() ermittelt der Client den BCAM-Host-Namen.
Der Client erzeugt mit der Funktion socket() einen Kommunikationsendpunkt (Client-Socket) sowie den zugehörigen Deskriptor.
Dem neu generierten Socket ordnet der Client mit bind() einen Namen zu.
Mit connect() stellt der Client die Verbindung zum Kommunikationspartner (Server-Socket) her.
Mit send() sendet der Client Benutzerdaten an den Partner-Socket (Server-Socket).
Mit der Funktion soc_close() wird der (Client-)Socket wieder geschlossen.