Dan Neveu wrote:
I'm trying to utilize this class which I found (libtcp++) in order to provide tcp client capabilities to my GL code: http://www.sashanet.com/internet/download.html
Then Miller Puckette wrote :
DO IT!! this is exactly what I'm hoping the netsend~/netreceive~ objects will encourage!
I did something similar a couple of weeks ago to drive my openGL app with PD. I only need udp communication from PD to my app, so I hacked the source code of u_pdreceive, which is one of Miller's sample applications that uses the FUDI protocol. I stripped everything not needed, so it's not as flexible as the original u_pdreceive (no tcp), but it's simple and it works very well, at least on the same machine.
Here's the source:
/* -- file "u_pd_in.c" -- (sorry, not commented) */
// Maybe some header files are not needed here... #include <sys/types.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <sys/time.h>
typedef struct _fdpoll { int fdp_fd; char *fdp_inbuf; int fdp_inhead; int fdp_intail; int fdp_udp; } t_fdpoll;
static int maxfd; static int sockfd;
static void sockerror(char *s);
#define BUFSIZE 1024
char *u_pd_in_argv[25]; int u_pd_in_argc = 0;
int init_u_pd_in() { int portno = 3001; struct sockaddr_in server;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
sockerror("socket()");
return(1);
}
maxfd = sockfd + 1;
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
/* assign client port number */
server.sin_port = htons((unsigned short)portno);
/* name the socket */
if (bind(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0)
{
sockerror("bind");
close(sockfd);
return (0);
}
return(0);
}
char *check_u_pd_in(void)
{
fd_set readset;
struct timeval tv;
char *buf[BUFSIZE], *command;
int retval, ret;
FD_ZERO(&readset);
FD_SET(sockfd, &readset);
tv.tv_sec = 0; tv.tv_usec = 5;
retval = select(maxfd+1, &readset, NULL, NULL, &tv);
command = strdup("");
if (retval > 0) {
ret = recv(sockfd, &buf, BUFSIZE, 0);
if (ret < 0) {
sockerror("recv (udp)");
close(sockfd);
exit(1);
}
if (ret > 0)
command = strtok((char *)buf, ";");
}
return(command);
}
static void sockerror(char *s) { int err = errno; fprintf(stderr, "%s: %s (%d)\n", s, strerror(err), err); }
/* -- enf of file "u_pd_in.c -- */
In my application main loop, I check if there's new messages from PD, I split the incoming string in a argv style array, then I parse the arguments:
void check_u_pd_command(void) { int argc = 0; char *argv[25], *buffer, *token; const char *delims = " ";
// get a new list from PD buffer = strdup(check_u_pd_in()); // split the string token = strtok(buffer, delims); while(token != (char *)NULL) { argv[argc] = token; argc++; token = strtok(NULL, delims); } free(buffer); if (argc == 0) return;
// parse the arguments and do something if (!strcmp(argv[0],"test")) { printf("test: %s, %s\n", argv[1], argv[2]); } else .... }
Voilà !