Jump to content United States-English
HP.com Home Products and Services Support and Drivers Solutions How to Buy
» Contact HP
More options
HP.com home
SCTP Programmer's Guide: HP-UX 11i v2, HP-UX 11i v3 > Appendix A SCTP Sample Programs

Sample Client Programs

» 

Technical documentation

» Feedback
Content starts here

 » Table of Contents

 » Glossary

 » Index

This section lists the sample client programs for both one-to-one and one-to-many associations.

This section addresses the following topics:

One-to-One Client Program

The following sample program is an implementation of an echo client over SCTP in a one-to-one association:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/sctp.h>
#include <sys/uio.h>

int debug=0;

int main(argc, argv)
int argc;
char **argv;
{
	int sock_fd, sz, len, msg_flags;
	int idleTime = 2;
	struct sockaddr_in sin[1], serv_addr;
	struct sctp_event_subscribe event;
	char buf[256];
	struct sctp_sndrcvinfo sri;

	if (argc < 3) {
		printf ("\nUsage: <%s> <remote-ip> <port>  \n\n", argv[0]);
		return -1;
	}

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons (atoi(argv[2]));
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

	sock_fd = socket (AF_INET, SOCK_STREAM, IPPROTO_SCTP);
	if (sock_fd == -1) {
		printf ("\nUnable to create socket \n");
		return -1;
	}

	if (connect (sock_fd, (struct sockaddr *) &serv_addr, 
				sizeof(serv_addr)) < 0) {
		printf ("\nUnable to connect to remote server [%s] !! \n\n", 
					inet_ntoa(serv_addr.sin_addr));
		return -1;
	} else {
		printf ("\nConnected to [%s]\n", inet_ntoa(serv_addr.sin_addr));
	}

	memset (&event, 0, sizeof(event));
	if (setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, 
				&event, sizeof(event)) != 0) {
               perror("setevent failed");
               exit(1);
        }

	memset (buf, 0, sizeof(buf));
	len = sizeof(serv_addr);
	printf ("<S>: ");

	while (fgets(buf, 256, stdin)) {
		if (buf[0] != '[') {
			if (!strncmp(buf, "exit", 4))
				break;
			printf ("Error, line must be of the form '[stream#]text'\n");
			continue;
		}
		sri.sinfo_stream = strtol(buf+1, NULL, 0);
		sz = strlen(buf);

		len = sizeof(serv_addr);
		sz = sctp_sendmsg (sock_fd, buf, sz, 0, len, 0, 0,
					sri.sinfo_stream, 0, 0);
		if (debug) printf ("sctp_sendmsg:[%d,e:%d]\n", sz, errno);
		if (sz <= 0)
			break;

		sz = sctp_recvmsg (sock_fd, buf, sizeof(buf), 
				0, 0, &sri, &msg_flags);
		if (debug) printf ("sctp_recvmsg:[%d,e:%d] ", sz, errno);
		if (sz <= 0)
			break;
		printf ("<-- %s on str %d\n", buf, sri.sinfo_stream);

		memset (buf, 0, sizeof(buf));
		printf ("<S>: ");
	}

	printf ("\nOver !!\n");
	close (sock_fd);

	return 0;
}

One-to-Many Client Program

The following sample program is an implementation of an echo client over SCTP in a one-to-one association:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/sctp.h>
#include <sys/uio.h>

int debug=0;

int main(argc, argv)
int argc;
char **argv;
{
	int sock_fd, sz, len, msg_flags;
	int idleTime = 2;
	struct sockaddr_in sin[1], serv_addr;
	struct sctp_event_subscribe event;
	char buf[256];
	struct sctp_sndrcvinfo sri;

	if (argc < 3) {
		printf ("\nUsage: <%s> <remote-ip> <port> \n\n", argv[0]);
		return -1;
	}

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons (atoi(argv[2]));
	serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

	sock_fd = socket (AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);
	if (sock_fd == -1) {
		printf ("\nUnable to create socket \n");
		return -1;
	}

	if (connect (sock_fd, (struct sockaddr *) &serv_addr, 
				sizeof(serv_addr)) < 0) {
		printf ("\nUnable to connect to remote server [%s] !! \n\n", 
					inet_ntoa(serv_addr.sin_addr));
		return -1;
	} else {
		printf ("\nConnected to [%s]\n", inet_ntoa(serv_addr.sin_addr));
	}

	memset (&event, 0, sizeof(event));
	if (setsockopt(sock_fd, IPPROTO_SCTP, SCTP_EVENTS, 
				&event, sizeof(event)) != 0) {
               perror("setevent failed");
               exit(1);
        }

	memset (buf, 0, sizeof(buf));
	len = sizeof(serv_addr);
	printf ("<S>: ");

	while (fgets(buf, 256, stdin)) {
		if (buf[0] != '[') {
			if (!strncmp(buf, "exit", 4))
				break;
			printf ("Error, line must be of the form '[stream#]text'\n");
			continue;
		}
		sri.sinfo_stream = strtol(buf+1, NULL, 0);
		sz = strlen(buf);

		len = sizeof(serv_addr);
		sz = sctp_sendmsg (sock_fd, buf, sz, &serv_addr, len, 0, 0,
					sri.sinfo_stream, 0, 0);
		if (debug) printf ("sctp_sendmsg:[%d,e:%d]\n", sz, errno);

		sz = sctp_recvmsg (sock_fd, buf, sizeof(buf), 
				&serv_addr, &len, &sri, &msg_flags);
		if (debug) printf ("sctp_recvmsg:[%d,e:%d] ", sz, errno);
		if (sz <= 0)
			break;
		printf ("<-- %s on str %d\n", buf, sri.sinfo_stream);

		memset (buf, 0, sizeof(buf));
		printf ("<S>: ");
	}

	printf ("\nOver !!\n");
	close (sock_fd);

	return 0;
}

Printable version
Privacy statement Using this site means you accept its terms Feedback to webmaster
© 2007–2008 Hewlett-Packard Development Company, L.P.