Changes

2,621 bytes removed ,  16:58, 12 April 2013
move the code out to a subpage, include it
Line 8: Line 8:  
! <code>tcp-howto.c</code>
 
! <code>tcp-howto.c</code>
 
|-
 
|-
| <syntaxhighlight lang="c">
+
| {{:Simple_TCP_pair/tcp-howto.c}}
#include <sys/socket.h>
  −
#include <linux/types.h>
  −
#include <sys/types.h>
  −
#include <arpa/inet.h>
  −
#include <unistd.h>
  −
#include <string.h>
  −
#include <stdlib.h>
  −
#include <stdio.h>
  −
#include <signal.h>
  −
 
  −
static int serve_new_conn(int sk)
  −
{
  −
int rd, wr;
  −
char buf[1024];
  −
 
  −
printf("New connection\n");
  −
 
  −
while (1) {
  −
rd = read(sk, buf, sizeof(buf));
  −
if (!rd)
  −
break;
  −
 
  −
if (rd < 0) {
  −
perror("Can't read socket");
  −
return 1;
  −
}
  −
 
  −
wr = 0;
  −
while (wr < rd) {
  −
int w;
  −
 
  −
w = write(sk, buf + wr, rd - wr);
  −
if (w <= 0) {
  −
perror("Can't write socket");
  −
return 1;
  −
}
  −
 
  −
wr += w;
  −
}
  −
}
  −
 
  −
printf("Done\n");
  −
return 0;
  −
}
  −
 
  −
static int main_srv(int argc, char **argv)
  −
{
  −
int sk, port, ret;
  −
struct sockaddr_in addr;
  −
 
  −
/*
  −
* Let kids die themselves
  −
*/
  −
 
  −
signal(SIGCHLD, SIG_IGN);
  −
 
  −
sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  −
if (sk < 0) {
  −
perror("Can't create socket");
  −
return -1;
  −
}
  −
 
  −
port = atoi(argv[1]);
  −
memset(&addr, 0, sizeof(addr));
  −
addr.sin_family = AF_INET;
  −
addr.sin_addr.s_addr = htonl(INADDR_ANY);
  −
addr.sin_port = htons(port);
  −
 
  −
printf("Binding to port %d\n", port);
  −
 
  −
ret = bind(sk, (struct sockaddr *)&addr, sizeof(addr));
  −
if (ret < 0) {
  −
perror("Can't bind socket");
  −
return -1;
  −
}
  −
 
  −
ret = listen(sk, 16);
  −
if (ret < 0) {
  −
perror("Can't put sock to listen");
  −
return -1;
  −
}
  −
 
  −
printf("Waiting for connections\n");
  −
while (1) {
  −
int ask, pid;
  −
 
  −
ask = accept(sk, NULL, NULL);
  −
if (ask < 0) {
  −
perror("Can't accept new conn");
  −
return -1;
  −
}
  −
 
  −
pid = fork();
  −
if (pid < 0) {
  −
perror("Can't fork");
  −
return -1;
  −
}
  −
 
  −
if (pid > 0)
  −
close(ask);
  −
else {
  −
close(sk);
  −
ret = serve_new_conn(ask);
  −
exit(ret);
  −
}
  −
}
  −
}
  −
 
  −
static int main_cl(int argc, char **argv)
  −
{
  −
int sk, port, ret, val = 1, rval;
  −
struct sockaddr_in addr;
  −
 
  −
sk = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  −
if (sk < 0) {
  −
perror("Can't create socket");
  −
return -1;
  −
}
  −
 
  −
port = atoi(argv[2]);
  −
printf("Connecting to %s:%d\n", argv[1], port);
  −
memset(&addr, 0, sizeof(addr));
  −
addr.sin_family = AF_INET;
  −
ret = inet_aton(argv[1], &addr.sin_addr);
  −
if (ret < 0) {
  −
perror("Can't convert addr");
  −
return -1;
  −
}
  −
addr.sin_port = htons(port);
  −
 
  −
ret = connect(sk, (struct sockaddr *)&addr, sizeof(addr));
  −
if (ret < 0) {
  −
perror("Can't connect");
  −
return -1;
  −
}
  −
 
  −
while (1) {
  −
write(sk, &val, sizeof(val));
  −
rval = -1;
  −
read(sk, &rval, sizeof(rval));
  −
printf("PP %d -> %d\n", val, rval);
  −
sleep(2);
  −
val++;
  −
}
  −
}
  −
 
  −
int main(int argc, char **argv)
  −
{
  −
if (argc == 2)
  −
return main_srv(argc, argv);
  −
else if (argc == 3)
  −
return main_cl(argc, argv);
  −
 
  −
printf("Bad usage\n");
  −
return 1;
  −
}
  −
</syntaxhighlight>
   
|}
 
|}