<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://criu.org/index.php?action=history&amp;feed=atom&amp;title=Simple_TCP_pair%2Ftcp-howto.c</id>
	<title>Simple TCP pair/tcp-howto.c - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://criu.org/index.php?action=history&amp;feed=atom&amp;title=Simple_TCP_pair%2Ftcp-howto.c"/>
	<link rel="alternate" type="text/html" href="https://criu.org/index.php?title=Simple_TCP_pair/tcp-howto.c&amp;action=history"/>
	<updated>2026-05-13T16:21:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.6</generator>
	<entry>
		<id>https://criu.org/index.php?title=Simple_TCP_pair/tcp-howto.c&amp;diff=930&amp;oldid=prev</id>
		<title>Kir: moved from the Simple TCP pair page</title>
		<link rel="alternate" type="text/html" href="https://criu.org/index.php?title=Simple_TCP_pair/tcp-howto.c&amp;diff=930&amp;oldid=prev"/>
		<updated>2013-04-12T16:57:58Z</updated>

		<summary type="html">&lt;p&gt;moved from the &lt;a href=&quot;/Simple_TCP_pair&quot; title=&quot;Simple TCP pair&quot;&gt;Simple TCP pair&lt;/a&gt; page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;linux/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;signal.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static int serve_new_conn(int sk)&lt;br /&gt;
{&lt;br /&gt;
	int rd, wr;&lt;br /&gt;
	char buf[1024];&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;New connection\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		rd = read(sk, buf, sizeof(buf));&lt;br /&gt;
		if (!rd)&lt;br /&gt;
			break;&lt;br /&gt;
&lt;br /&gt;
		if (rd &amp;lt; 0) {&lt;br /&gt;
			perror(&amp;quot;Can't read socket&amp;quot;);&lt;br /&gt;
			return 1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		wr = 0;&lt;br /&gt;
		while (wr &amp;lt; rd) {&lt;br /&gt;
			int w;&lt;br /&gt;
&lt;br /&gt;
			w = write(sk, buf + wr, rd - wr);&lt;br /&gt;
			if (w &amp;lt;= 0) {&lt;br /&gt;
				perror(&amp;quot;Can't write socket&amp;quot;);&lt;br /&gt;
				return 1;&lt;br /&gt;
			}&lt;br /&gt;
&lt;br /&gt;
			wr += w;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Done\n&amp;quot;);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static int main_srv(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	int sk, port, ret;&lt;br /&gt;
	struct sockaddr_in addr;&lt;br /&gt;
&lt;br /&gt;
	/*&lt;br /&gt;
	 * Let kids die themselves&lt;br /&gt;
	 */&lt;br /&gt;
&lt;br /&gt;
	signal(SIGCHLD, SIG_IGN);&lt;br /&gt;
&lt;br /&gt;
	sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br /&gt;
	if (sk &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't create socket&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	port = atoi(argv[1]);&lt;br /&gt;
	memset(&amp;amp;addr, 0, sizeof(addr));&lt;br /&gt;
	addr.sin_family = AF_INET;&lt;br /&gt;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);&lt;br /&gt;
	addr.sin_port = htons(port);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Binding to port %d\n&amp;quot;, port);&lt;br /&gt;
&lt;br /&gt;
	ret = bind(sk, (struct sockaddr *)&amp;amp;addr, sizeof(addr));&lt;br /&gt;
	if (ret &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't bind socket&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret = listen(sk, 16);&lt;br /&gt;
	if (ret &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't put sock to listen&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Waiting for connections\n&amp;quot;);&lt;br /&gt;
	while (1) {&lt;br /&gt;
		int ask, pid;&lt;br /&gt;
&lt;br /&gt;
		ask = accept(sk, NULL, NULL);&lt;br /&gt;
		if (ask &amp;lt; 0) {&lt;br /&gt;
			perror(&amp;quot;Can't accept new conn&amp;quot;);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		pid = fork();&lt;br /&gt;
		if (pid &amp;lt; 0) {&lt;br /&gt;
			perror(&amp;quot;Can't fork&amp;quot;);&lt;br /&gt;
			return -1;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (pid &amp;gt; 0)&lt;br /&gt;
			close(ask);&lt;br /&gt;
		else {&lt;br /&gt;
			close(sk);&lt;br /&gt;
			ret = serve_new_conn(ask);&lt;br /&gt;
			exit(ret);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static int main_cl(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	int sk, port, ret, val = 1, rval;&lt;br /&gt;
	struct sockaddr_in addr;&lt;br /&gt;
&lt;br /&gt;
	sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);&lt;br /&gt;
	if (sk &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't create socket&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	port = atoi(argv[2]);&lt;br /&gt;
	printf(&amp;quot;Connecting to %s:%d\n&amp;quot;, argv[1], port);&lt;br /&gt;
	memset(&amp;amp;addr, 0, sizeof(addr));&lt;br /&gt;
	addr.sin_family = AF_INET;&lt;br /&gt;
	ret = inet_aton(argv[1], &amp;amp;addr.sin_addr);&lt;br /&gt;
	if (ret &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't convert addr&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
	addr.sin_port = htons(port);&lt;br /&gt;
&lt;br /&gt;
	ret = connect(sk, (struct sockaddr *)&amp;amp;addr, sizeof(addr));&lt;br /&gt;
	if (ret &amp;lt; 0) {&lt;br /&gt;
		perror(&amp;quot;Can't connect&amp;quot;);&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	while (1) {&lt;br /&gt;
		write(sk, &amp;amp;val, sizeof(val));&lt;br /&gt;
		rval = -1;&lt;br /&gt;
		read(sk, &amp;amp;rval, sizeof(rval));&lt;br /&gt;
		printf(&amp;quot;PP %d -&amp;gt; %d\n&amp;quot;, val, rval);&lt;br /&gt;
		sleep(2);&lt;br /&gt;
		val++;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char **argv)&lt;br /&gt;
{&lt;br /&gt;
	if (argc == 2)&lt;br /&gt;
		return main_srv(argc, argv);&lt;br /&gt;
	else if (argc == 3)&lt;br /&gt;
		return main_cl(argc, argv);&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;Bad usage\n&amp;quot;);&lt;br /&gt;
	return 1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Kir</name></author>
	</entry>
</feed>