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