From 14b91cfb28770cfc0170f2022fd55d6e9f2089e8 Mon Sep 17 00:00:00 2001 From: Fons Rademakers <Fons.Rademakers@cern.ch> Date: Fri, 28 Oct 2011 14:23:17 +0000 Subject: [PATCH] From Marcelo: Tutorial on how to use TUdpSocket. - udpserver.c is a small UDP echo server - testTUdpSocket sends a message to the echo server and prints the answer git-svn-id: http://root.cern.ch/svn/root/trunk@41633 27541ba8-7e3a-0410-8455-c3a389f83636 --- tutorials/net/testTUdpSocket.C | 84 ++++++++++++++++++++++++++++++++ tutorials/net/udpserver.c | 89 ++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100755 tutorials/net/testTUdpSocket.C create mode 100755 tutorials/net/udpserver.c diff --git a/tutorials/net/testTUdpSocket.C b/tutorials/net/testTUdpSocket.C new file mode 100755 index 00000000000..7aa55f025b5 --- /dev/null +++ b/tutorials/net/testTUdpSocket.C @@ -0,0 +1,84 @@ +#include "TUdpSocket.h" +#include "TString.h" + +// +// As test echo server use udpserver.c in the same directory. +// To compile it do: +// clang udpserver.c -o udpserver +// + +// int createTServerSocket(){ +// printf("testTSocket: Creating TSocket\n"); +// TServerSocket * fServerSocket = new TServerSocket(1501, 0, 0, -1, "UDP"); +// +// TMonitor *mon = new TMonitor; +// +// mon->Add(fServerSocket); +// +// TSocket *s0 = 0; +// +// // while (1) { +// char msgRaw[1024] = {0}; +// TSocket *s; +// +// s = mon->Select(); +// +// if (s->IsA() == TServerSocket::Class()) { +// if (!s0) { +// s0 = ((TServerSocket *)s)->Accept(); +// s0->Send("go 0"); +// mon->Add(s0); +// } +// +// if (s0) { +// mon->Remove(ss); +// ss->Close(); +// } +// continue; +// } +// +// s->RecvRaw((void *) msgRaw, 1024); +// printf("Server Message Received %s\n", msgRaw); +// s->SendRaw(msgRaw, 1024); +// +// // }/* end of server infinite loop */ +// +// s0->Close(); +// +// return 1; +// } + +int testTUdpSocket(){ + printf("testTSocket: Creating TUdpSocket\n"); + TUdpSocket * fSocket = new TUdpSocket("localhost", 1500); + + if(!fSocket || !fSocket->IsValid()){ + Error("testTSocket","cannot connect to localhost"); + return -1; + } + + TString msg = "testTSocket: Testing TSocket with UDP"; + + printf("%s\n",msg.Data()); + + if(fSocket->SendRaw(msg.Data(), msg.Length()) == -1) { + Error("testTSocket", "error sending command to host %s", fServer.GetHost()); + return -1; + } + + char msgRaw[1024] = {0}; + + fSocket->SetOption(kNoBlock, 1); + fSocket->Select(); + + Int_t recvBytes = fSocket->RecvRaw(msgRaw, 1024); + + if(recvBytes == -1){ + Error("testTSocket", "error receiving data from host %s", fServer.GetHost()); + return -1; + } + + printf("Received Message: \n%s\n",msgRaw); + + return 1; +} diff --git a/tutorials/net/udpserver.c b/tutorials/net/udpserver.c new file mode 100755 index 00000000000..9823e28debe --- /dev/null +++ b/tutorials/net/udpserver.c @@ -0,0 +1,89 @@ +/* fpont 12/99 */ +/* pont.net */ +/* udpserver.c */ + +/* Converted to echo client/server with select() (timeout option). + See testTUdpSocket.C */ +/* Compile with: gcc udpserver.c -o udpserver +/* 3/30/05 John Schultz */ + +#include <stdlib.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <netdb.h> +#include <stdio.h> +#include <unistd.h> /* close() */ +#include <string.h> /* memset() */ + +#define LOCAL_SERVER_PORT 1500 +#define MAX_MSG 100 + +int main(int argc, char *argv[]) { + + int sd, rc, n, flags; + unsigned cliLen; + struct sockaddr_in cliAddr, servAddr; + char msg[MAX_MSG]; + + /* socket creation */ + sd=socket(AF_INET, SOCK_DGRAM, 0); + if(sd<0) { + printf("%s: cannot open socket \n",argv[0]); + exit(1); + } + + /* bind local server port */ + servAddr.sin_family = AF_INET; + servAddr.sin_addr.s_addr = htonl(INADDR_ANY); + servAddr.sin_port = htons(LOCAL_SERVER_PORT); + rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr)); + if(rc<0) { + printf("%s: cannot bind port number %d \n", + argv[0], LOCAL_SERVER_PORT); + exit(1); + } + + printf("%s: waiting for data on port UDP %u\n", + argv[0],LOCAL_SERVER_PORT); + +/* BEGIN jcs 3/30/05 */ + + flags = 0; + +/* END jcs 3/30/05 */ + + /* server infinite loop */ + while(1) { + + /* init buffer */ + memset(msg,0x0,MAX_MSG); + + /* receive message */ + cliLen = sizeof(cliAddr); + n = recvfrom(sd, msg, MAX_MSG, flags, + (struct sockaddr *) &cliAddr, &cliLen); + + if(n<0) { + printf("%s: cannot receive data \n",argv[0]); + continue; + } + + /* print received message */ + printf("%s: from %s:UDP%u : %s \n", + argv[0],inet_ntoa(cliAddr.sin_addr), + ntohs(cliAddr.sin_port),msg); + +/* BEGIN jcs 3/30/05 */ + + sleep(1); + sendto(sd,msg,n,flags,(struct sockaddr *)&cliAddr,cliLen); + +/* END jcs 3/30/05 */ + + }/* end of server infinite loop */ + +return 0; + +} -- GitLab