TCP Server Examples
Revision as of 10:14, 28 April 2008 by PeterHarding (talk | contribs)
Python Test Server
A simple ECHO server
# cat svr.py
#!/usr/bin/env python
# Echo server program
import socket
HOST = '' # Symbolic name meaning the local host
PORT = 9578 # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
C Client
# cat tcp_client_tst.c
/*
* Author: Peter Harding <plh@performiq.com.au>
*
* PerformIQ Pty. Ltd.
* Level 6, 6195,
* 170 Queen Street,
* MELBOURNE, VIC, 3000
*
* Phone: 03 9641 2222
* Fax: 03 9641 2200
* Mobile: 0418 375 085
*
* Copyright (C) Peter Harding, 1997-2008
*/
static char
id[] = "@(#) [1.0.0] tcp_client_tst.c 05/03/2008";
/********************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <sys/time.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
//--------------------------------------------------------------------
#define TCP "tcp"
//--------------------------------------------------------------------
extern int errno;
//--------------------------------------------------------------------
static int ierr;
//--------------------------------------------------------------------
char *recv_host = "plh";
char *recv_service = "dserver";
long the_address;
int the_port = 9578;
int sfd = -1;
//--------------------------------------------------------------------
char* sock_send(char*);
void init(void);
//--------------------------------------------------------------------
void init(void)
{
struct hostent *host_ent;
struct servent *serv_ent;
struct sockaddr_in sin;
u_short b0, b1, b2, b3;
recv_host = "localhost";
fprintf(stderr, "recv_host = \"%s\"\n", recv_host);
if ((host_ent = gethostbyname(recv_host)) == (struct hostent*)0 ) {
fprintf(stderr, "Call failed\n");
exit(0);
}
// fprintf(stderr, "Call -> %s\n", host_ent);
b0 = *(host_ent->h_addr_list[0] + 0) & 0xff;
b1 = *(host_ent->h_addr_list[0] + 1) & 0xff;
b2 = *(host_ent->h_addr_list[0] + 2) & 0xff;
b3 = *(host_ent->h_addr_list[0] + 3) & 0xff;
the_address = (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
fprintf(stderr, " name: %s\n", host_ent->h_name);
fprintf(stderr, " type: %d\n", host_ent->h_addrtype);
fprintf(stderr, " alias: %s\n", *host_ent->h_aliases);
fprintf(stderr, " length: %d\n", host_ent->h_length);
fprintf(stderr, "IP Address: %d.%d.%d.%d\n",
b0 & 0xff, b1 & 0xff, b2 & 0xff, b3 & 0xff);
if ((serv_ent = getservbyname(recv_service, TCP)) == (struct servent*)0 ) {
exit(2);
}
//the_port = serv_ent->s_port;
fprintf(stderr, "Got address 0x%08x\n", the_address);
fprintf(stderr, "Got port %d for %s\n", the_port, recv_service);
//if ((sfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0 ) {
if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == 0 ) {
fprintf(stderr, "[initiateConnection] socket() failed (errno %d)", errno);
exit(3);
}
fprintf(stderr, "@@@ socket fd = %d\n", sfd );
memcpy(&sin.sin_addr.s_addr, host_ent->h_addr, host_ent->h_length);
sin.sin_family = AF_INET;
sin.sin_port = htons (the_port);
//sin.sin_addr.s_addr = the_address;
if ((ierr = connect(sfd, (struct sockaddr*)&sin, sizeof(struct sockaddr_in))) == -1) {
fprintf(stderr,
"[initiateConnection] connect() failed (errno %d)", errno);
exit(4);
}
fprintf(stderr, "connected\n");
} // init
//--------------------------------------------------------------------
char* sock_send(char *buf)
{
int n;
//fprintf(stderr, "[sock_send] buf = \"%s\"\n\n", buf);
n = write(sfd, buf, strlen(buf));
if ((n = read(sfd, buf, 1024)) == 0) {
exit(0);
}
buf[n] = '\0';
//fprintf(stderr, "\nbuf -> \"%s\"\n", buf);
return buf;
} // sock_send
//--------------------------------------------------------------------
main(argc, argv)
int argc;
char *argv[];
{
char buf[1024];
char *s;
int i;
int ds_idx;
int serial;
init();
sprintf(buf, "REG|Sequence");
s = sock_send(buf);
ds_idx = atoi(s);
for (i = 0; i < 3; i++) {
sprintf(buf, "GETN|%d", ds_idx);
s = sock_send(buf);
serial = atoi(s);
fprintf(stderr, "serial -> \"%d\"\n", serial);
sleep(2);
}
} // main
//--------------------------------------------------------------------