aboutsummaryrefslogtreecommitdiff
path: root/net/x_net_tcpsend.c
diff options
context:
space:
mode:
authorMartin Peach <mrpeach@users.sourceforge.net>2006-08-24 06:51:16 +0000
committerMartin Peach <mrpeach@users.sourceforge.net>2006-08-24 06:51:16 +0000
commitad3e4ced602b5ec7b1005635342e8f338c6bd2fa (patch)
tree13bb689b21951fb41ae9282a7a51073c2f0160fa /net/x_net_tcpsend.c
parent59fe72b56dd0b97625a8061304b257269c00d790 (diff)
Renamed files without x_net_ prefix.
Removed extra copies of tcpserver and tcpclient svn path=/trunk/externals/mrpeach/; revision=5726
Diffstat (limited to 'net/x_net_tcpsend.c')
-rwxr-xr-xnet/x_net_tcpsend.c222
1 files changed, 0 insertions, 222 deletions
diff --git a/net/x_net_tcpsend.c b/net/x_net_tcpsend.c
deleted file mode 100755
index cf8c33d..0000000
--- a/net/x_net_tcpsend.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* x_net_tcpsend.c 20060424 Martin Peach did it based on x_net.c. x_net.c header follows: */
-/* Copyright (c) 1997-1999 Miller Puckette.
-* For information on usage and redistribution, and for a DISCLAIMER OF ALL
-* WARRANTIES, see the file, "LICENSE.txt," in this distribution. */
-
-/* network */
-
-#include "m_pd.h"
-#include "s_stuff.h"
-
-#ifdef MSW
-#include <winsock2.h>
-#else
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <string.h>
-#endif
-
-static t_class *tcpsend_class;
-
-typedef struct _tcpsend
-{
- t_object x_obj;
- int x_fd;
-} t_tcpsend;
-
-#ifdef MSW
-__declspec(dllexport)
-#endif
-void tcpsend_setup(void);
-static void tcpsend_free(t_tcpsend *x);
-static void tcpsend_send(t_tcpsend *x, t_symbol *s, int argc, t_atom *argv);
-static void tcpsend_disconnect(t_tcpsend *x);
-static void tcpsend_connect(t_tcpsend *x, t_symbol *hostname, t_floatarg fportno);
-static void *tcpsend_new(void);
-
-static void *tcpsend_new(void)
-{
- t_tcpsend *x = (t_tcpsend *)pd_new(tcpsend_class);
- outlet_new(&x->x_obj, &s_float);
- x->x_fd = -1;
- return (x);
-}
-
-static void tcpsend_connect(t_tcpsend *x, t_symbol *hostname,
- t_floatarg fportno)
-{
- struct sockaddr_in server;
- struct hostent *hp;
- int sockfd;
- int portno = fportno;
- int intarg;
-
- if (x->x_fd >= 0)
- {
- error("tcpsend: already connected");
- return;
- }
-
- /* create a socket */
- sockfd = socket(AF_INET, SOCK_STREAM, 0);
-#ifdef DEBUG
- fprintf(stderr, "tcpsend_connect: send socket %d\n", sockfd);
-#endif
- if (sockfd < 0)
- {
- sys_sockerror("tcpsend: socket");
- return;
- }
- /* connect socket using hostname provided in command line */
- server.sin_family = AF_INET;
- hp = gethostbyname(hostname->s_name);
- if (hp == 0)
- {
- post("tcpsend: bad host?\n");
- return;
- }
- /* for stream (TCP) sockets, specify "nodelay" */
- intarg = 1;
- if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY,
- (char *)&intarg, sizeof(intarg)) < 0)
- post("tcpsend: setsockopt (TCP_NODELAY) failed\n");
-
- memcpy((char *)&server.sin_addr, (char *)hp->h_addr, hp->h_length);
-
- /* assign client port number */
- server.sin_port = htons((u_short)portno);
-
- post("tcpsend: connecting to port %d", portno);
- /* try to connect. */
- if (connect(sockfd, (struct sockaddr *) &server, sizeof (server)) < 0)
- {
- sys_sockerror("tcpsend: connecting stream socket");
- sys_closesocket(sockfd);
- return;
- }
- x->x_fd = sockfd;
- outlet_float(x->x_obj.ob_outlet, 1);
-}
-
-static void tcpsend_disconnect(t_tcpsend *x)
-{
- if (x->x_fd >= 0)
- {
- sys_closesocket(x->x_fd);
- x->x_fd = -1;
- outlet_float(x->x_obj.ob_outlet, 0);
- post("tcpsend: disconnected");
- }
-}
-
-static void tcpsend_send(t_tcpsend *x, t_symbol *s, int argc, t_atom *argv)
-{
- static char byte_buf[65536];// arbitrary maximum similar to max IP packet size
- int i, d;
- char c;
- float f, e;
- char *bp;
- int length, sent;
- int result;
- static double lastwarntime;
- static double pleasewarn;
- double timebefore;
- double timeafter;
- int late;
-
-#ifdef DEBUG
- post("s: %s", s->s_name);
- post("argc: %d", argc);
-#endif
- for (i = 0; i < argc; ++i)
- {
- if (argv[i].a_type == A_FLOAT)
- {
- f = argv[i].a_w.w_float;
- d = (int)f;
- e = f - d;
- if (e != 0)
- {
- error("tcpsend_send: item %d (%f) is not an integer", i, f);
- return;
- }
- c = (unsigned char)d;
- if (c != d)
- {
- error("tcpsend_send: item %d (%f) is not between 0 and 255", i, f);
- return;
- }
-#ifdef DEBUG
- post("tcpsend_send: argv[%d]: %d", i, c);
-#endif
- byte_buf[i] = c;
- }
- else
- {
- error("tcpsend_send: item %d is not a float", i);
- return;
- }
- }
-
- length = i;
- if ((x->x_fd >= 0) && (length > 0))
- {
- for (bp = byte_buf, sent = 0; sent < length;)
- {
- timebefore = sys_getrealtime();
- result = send(x->x_fd, byte_buf, length-sent, 0);
- timeafter = sys_getrealtime();
- late = (timeafter - timebefore > 0.005);
- if (late || pleasewarn)
- {
- if (timeafter > lastwarntime + 2)
- {
- post("tcpsend blocked %d msec",
- (int)(1000 * ((timeafter - timebefore) + pleasewarn)));
- pleasewarn = 0;
- lastwarntime = timeafter;
- }
- else if (late) pleasewarn += timeafter - timebefore;
- }
- if (result <= 0)
- {
- sys_sockerror("tcpsend");
- tcpsend_disconnect(x);
- break;
- }
- else
- {
- sent += result;
- bp += result;
- }
- }
- }
- else error("tcpsend: not connected");
-}
-
-static void tcpsend_free(t_tcpsend *x)
-{
- tcpsend_disconnect(x);
-}
-
-#ifdef MSW
-__declspec(dllexport)
-#endif
-void tcpsend_setup(void)
-{
- tcpsend_class = class_new(gensym("tcpsend"), (t_newmethod)tcpsend_new,
- (t_method)tcpsend_free,
- sizeof(t_tcpsend), 0, 0);
- class_addmethod(tcpsend_class, (t_method)tcpsend_connect,
- gensym("connect"), A_SYMBOL, A_FLOAT, 0);
- class_addmethod(tcpsend_class, (t_method)tcpsend_disconnect,
- gensym("disconnect"), 0);
- class_addmethod(tcpsend_class, (t_method)tcpsend_send, gensym("send"),
- A_GIMME, 0);
-}
-
-/* end x_net_tcpsend.c*/