ip2gtp and a few changes, now can play on hte console
This commit is contained in:
parent
e866bc91f1
commit
331c626ca8
4
env.lisp
4
env.lisp
|
@ -14,3 +14,7 @@
|
||||||
(load (compile-file (concatenate 'string *src-root* "packages.lisp")))
|
(load (compile-file (concatenate 'string *src-root* "packages.lisp")))
|
||||||
(load (compile-file (concatenate 'string *src-root* "gobot.lisp")))
|
(load (compile-file (concatenate 'string *src-root* "gobot.lisp")))
|
||||||
(load (compile-file (concatenate 'string *src-root* "gtp.lisp")))
|
(load (compile-file (concatenate 'string *src-root* "gtp.lisp")))
|
||||||
|
|
||||||
|
;(load (concatenate 'string *src-root* "packages.lisp"))
|
||||||
|
;(load (concatenate 'string *src-root* "gobot.lisp"))
|
||||||
|
;(load (concatenate 'string *src-root* "gtp.lisp"))
|
||||||
|
|
5
gobot.sh
5
gobot.sh
|
@ -1,3 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
#echo $1 $2
|
||||||
/usr/bin/sbcl --noinform --load /home/dan/src/my/gobot/env.lisp --eval "(progn (gtp-handler:gtp-net-client \"$1\" $2) (quit))"
|
/usr/bin/sbcl --noinform --load /home/dan/src/my/gobot/packages.fasl --load /home/dan/src/my/gobot/gobot.fasl /home/dan/src/my/gobot/gtp.fasl --eval "(progn (gtp-handler:gtp-net-client \"$1\" $2) (quit))" 2>&1 /dev/null
|
||||||
|
#/usr/bin/sbcl --noinform --load /home/dan/src/my/gobot/env.lisp --eval "(progn (gtp-handler:gtp-client) (quit))"
|
||||||
|
|
7
gtp.lisp
7
gtp.lisp
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
;(require :sb-bsd-sockets)
|
;(require :sb-bsd-sockets)
|
||||||
|
|
||||||
|
|
||||||
(defparameter *quit?* nil)
|
(defparameter *quit?* nil)
|
||||||
|
;(defparameter *cputime*)
|
||||||
|
|
||||||
|
|
||||||
(defun nslookup (hostname)
|
(defun nslookup (hostname)
|
||||||
|
@ -52,11 +54,11 @@
|
||||||
(if (eql socket nil)
|
(if (eql socket nil)
|
||||||
()
|
()
|
||||||
(progn
|
(progn
|
||||||
(format t "Connection establish, playing...~%")
|
; (format t "Connection establish, playing...~%")
|
||||||
(do ()
|
(do ()
|
||||||
((or (eql socket nil) (eql *quit?* t)))
|
((or (eql socket nil) (eql *quit?* t)))
|
||||||
(let ((cmd (tcp-read socket)))
|
(let ((cmd (tcp-read socket)))
|
||||||
; (print cmd)
|
;(format t "cmd: '~a'~%'" cmd)
|
||||||
(let ((resp (dispatch-gtp-command cmd)))
|
(let ((resp (dispatch-gtp-command cmd)))
|
||||||
;(print resp)
|
;(print resp)
|
||||||
(tcp-print socket (concatenate 'string "= " resp (string #\newline) (string #\newline))))))))))
|
(tcp-print socket (concatenate 'string "= " resp (string #\newline) (string #\newline))))))))))
|
||||||
|
@ -84,6 +86,7 @@
|
||||||
(let* ((commands (split-string (string-upcase command-string) " "))
|
(let* ((commands (split-string (string-upcase command-string) " "))
|
||||||
;(cl-ppcre:split "\\s+" (string-upcase command-string)))
|
;(cl-ppcre:split "\\s+" (string-upcase command-string)))
|
||||||
(command (intern (first commands) :gtp-handler)))
|
(command (intern (first commands) :gtp-handler)))
|
||||||
|
;(print command)
|
||||||
(case command
|
(case command
|
||||||
(name go-bot:*name*)
|
(name go-bot:*name*)
|
||||||
(version go-bot:*version*)
|
(version go-bot:*version*)
|
||||||
|
|
|
@ -0,0 +1,226 @@
|
||||||
|
/*
|
||||||
|
* tcpserver.c
|
||||||
|
*
|
||||||
|
* Example BSD TCP socket server.
|
||||||
|
* Paired with tcpclient.c.
|
||||||
|
*
|
||||||
|
* OS: SunOS
|
||||||
|
* compiler: cc
|
||||||
|
* % cc -o tcpserver -g tcpserver.c
|
||||||
|
*
|
||||||
|
* To run:
|
||||||
|
* % tcpserver&
|
||||||
|
* % tcpclient localhost
|
||||||
|
*
|
||||||
|
* The server listen on a #define hardwired port TCPPORT (see below).
|
||||||
|
* It accepts some number of requests from the client and turns around
|
||||||
|
* and writes those buffers back to the client.
|
||||||
|
*
|
||||||
|
* This is a simple test server. A more 'normal' server would start
|
||||||
|
* at boot and block in an accept call (or be coded for the UNIX inetd
|
||||||
|
* which is in turn different). After the accept call, the server would
|
||||||
|
* fork a child to handle the connection. This server simply handles
|
||||||
|
* one connection and exits.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <iostream>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
#define TRUE 1
|
||||||
|
#define FALSE 0
|
||||||
|
|
||||||
|
#define TCPPORT 10000 /* server port value */
|
||||||
|
#define BUFSIZE 1024 /* size of i/o buffer */
|
||||||
|
#define NOREADS 10 /* number of buffers transferred */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* create socket
|
||||||
|
* bind to address
|
||||||
|
*/
|
||||||
|
int initSocket()
|
||||||
|
{
|
||||||
|
struct sockaddr_in server;
|
||||||
|
int sock;
|
||||||
|
int optval = 1;
|
||||||
|
int retVal;
|
||||||
|
|
||||||
|
/* create INTERNET,TCP socket
|
||||||
|
*/
|
||||||
|
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
|
if ( sock < 0 ) {
|
||||||
|
perror("socket");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
server.sin_family = AF_INET;
|
||||||
|
server.sin_addr.s_addr = INADDR_ANY;
|
||||||
|
|
||||||
|
server.sin_port = htons(TCPPORT); /* specific port */
|
||||||
|
|
||||||
|
/* bind protocol to socket
|
||||||
|
*/
|
||||||
|
if (bind(sock, (struct sockaddr *) &server, sizeof(server))) {
|
||||||
|
perror("bind");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
//retVal = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval));
|
||||||
|
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,(int *)&optval, sizeof(optval)) ;
|
||||||
|
return(sock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void doWrite(int sock, char *buf)
|
||||||
|
{
|
||||||
|
int len = strlen(buf);
|
||||||
|
char slen[8];
|
||||||
|
int rc;
|
||||||
|
sprintf(slen, "%04d", len);
|
||||||
|
rc = write(sock, slen, 4);
|
||||||
|
if (rc < 0) {
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
write(sock, buf, len);
|
||||||
|
if (rc < 0) {
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* read from socket. Read call issued to kernel
|
||||||
|
* may return with incomplete data. This routine
|
||||||
|
* must check that and force a complete read.
|
||||||
|
*/
|
||||||
|
void doRead(int sock, char *buf)
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
int rc;
|
||||||
|
char *bpt;
|
||||||
|
int count;
|
||||||
|
int amountNeeded;
|
||||||
|
int amtread;
|
||||||
|
|
||||||
|
bpt = buf;
|
||||||
|
|
||||||
|
rc =0;
|
||||||
|
while (rc < 4) {
|
||||||
|
rc += read(sock, bpt, 4-rc);
|
||||||
|
bpt += rc;
|
||||||
|
}
|
||||||
|
amountNeeded = atoi(buf);
|
||||||
|
count = amountNeeded;
|
||||||
|
bpt = buf;
|
||||||
|
|
||||||
|
amtread = 0;
|
||||||
|
|
||||||
|
again:
|
||||||
|
if ( (rc = read(sock,bpt,count)) < 0 ) {
|
||||||
|
perror("doRead: reading socket stream");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
amtread += rc;
|
||||||
|
|
||||||
|
if ( amtread < amountNeeded ) {
|
||||||
|
count = count - rc;
|
||||||
|
bpt = bpt + rc;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
buf[amountNeeded] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc,char **argv)
|
||||||
|
{
|
||||||
|
int sock;
|
||||||
|
int size;
|
||||||
|
char buf[BUFSIZE];
|
||||||
|
int msgsock;
|
||||||
|
struct sockaddr_in gotcha;
|
||||||
|
int rc;
|
||||||
|
int i;
|
||||||
|
char *cp;
|
||||||
|
char port[16];
|
||||||
|
pid_t pid;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sock = initSocket();
|
||||||
|
|
||||||
|
/* tcp starts listening for connections
|
||||||
|
*/
|
||||||
|
rc = listen(sock,5);
|
||||||
|
if ( rc < 0) {
|
||||||
|
perror("listen");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
/* accept one connection, will block here.
|
||||||
|
*/
|
||||||
|
size = sizeof (struct sockaddr_in);
|
||||||
|
pid = fork();
|
||||||
|
if (pid == 0) {
|
||||||
|
//sprintf(buf, "/home/dan/src/my/gobot/gobot.sh 127.0.0.1 %d 2>&1 /dev/null\n", TCPPORT);
|
||||||
|
sprintf(buf, "/usr/bin/sbcl --noinform --load /home/dan/src/my/gobot/packages.fasl --load /home/dan/src/my/gobot/gobot.fasl --load /home/dan/src/my/gobot/gtp.fasl --eval '(progn (gtp-handler:gtp-net-client \"127.0.0.1\" %d) (quit))' \n", TCPPORT);
|
||||||
|
|
||||||
|
//printf("%s\n", buf);
|
||||||
|
system(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* gotcha and size are returned when the connection comes in.
|
||||||
|
* When the client calls connect, and a connection occurs, accept
|
||||||
|
* returns. gotcha holds the client ip address and client port value.
|
||||||
|
* NOTE: the size parameter is a *pointer*, not an integer. The
|
||||||
|
* kernel returns the size of the socket structure in gotcha.
|
||||||
|
* This is called: "call by value-result". You have to pass in
|
||||||
|
* the size of the structure and the kernel returns the true result.
|
||||||
|
* For tcp/ip sockets the size never changes. For unix sockets
|
||||||
|
* it may change.
|
||||||
|
*/
|
||||||
|
msgsock = accept(sock, (struct sockaddr *) &gotcha, (socklen_t*)&size);
|
||||||
|
if (msgsock < 0 ) {
|
||||||
|
perror("accept");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read and echo so many packets
|
||||||
|
*/
|
||||||
|
/*for ( i = 0; i < NOREADS; i++) {
|
||||||
|
doRead(msgsock, buf, BUFSIZE);
|
||||||
|
rc = write(msgsock, buf, BUFSIZE);
|
||||||
|
if ( rc < 0 ) {
|
||||||
|
perror("write");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
do {
|
||||||
|
cin.getline(buf, BUFSIZE);
|
||||||
|
//printf("%s", buf);
|
||||||
|
doWrite(msgsock, buf);
|
||||||
|
buf[0] = '\0';
|
||||||
|
doRead(msgsock, buf);
|
||||||
|
//printf("%s", buf);
|
||||||
|
cout << buf;
|
||||||
|
buf[0] = '\0';
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
/* close sockets
|
||||||
|
*/
|
||||||
|
close(msgsock);
|
||||||
|
close(sock);
|
||||||
|
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue