UNIX Networking : Sockets TCP Transmitter and Reciever
Intro
Networking in UNIX or Linux is done with sockets. The following are 2 programs I made up.
1. Sends messages in TCP, Client
2. Listens and Recieves messages from TCP, Server
TCP or Transmission Control Protocol is a 2way connection which is more like a stream or a pipe. Both the ends must be connected.
The Transmitter
Reads messages from input and sends it to localhost:34000.
To Setup a transmitter following must be done:
1. Setup a port address and open a socket and bind to it.
2. Connect to server
3. Send messages
4. Close connection when done
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
/*Some are unused, But I read these are
general headers used in a network program
:)*/
int main(void)
{
struct sockaddr_in sin;
int s;
s = socket(AF_INET, SOCK_STREAM, 0);
if(!s)
{
perror("socket()");
return 1;
}
sin.sin_family = AF_INET;
sin.sin_port = htons(9999);
sin.sin_addr.s_addr = INADDR_ANY;//Just any would do
if(bind(s, (struct sockaddr *)&sin, sizeof(sin)))
{
perror("bind()");
return 1;
}
struct sockaddr_in sout;
sout.sin_family = AF_INET;
sout.sin_port = htons(34000);//Destination PORT!
sout.sin_addr.s_addr = inet_addr("127.0.0.1");//Destination IP Address, here localhost.
connect(s,(struct sockaddr *)&sout, sizeof(sout));//Connect to Server
char msg[1000];//Buffer
do
{
printf("Message: ");
scanf("%s",msg);
sendto(s, msg, strlen(msg)+1, 0,NULL,0);
//Sends the message
}while(*msg!='0'); /*Just an exit condition*/
close(s);//Close Socket
return 0;
}
The Reciever
This program listens to localhost:34000 and accepts first connection and prints the messages whenever it recieves one.
To Setup a reciever following must be done:
1. Setup a port address and open a socket and bind to it.
2. Listens for Clients to connect.
3. Accept connections
4. Recieve data
5. Close connection
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/time.h>
#include <stdlib.h>
int main(void)
{
struct sockaddr_in sin;
char msg[10000];
int ret;
int sin_length;
int s,s2;
s = socket(AF_INET, SOCK_DGRAM, 0);
if(!s)
{
perror("socket()");
return;
}
sin.sin_family = AF_INET;
sin.sin_port = htons(34000);
sin.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(s, (struct sockaddr *)&sin, sizeof(sin)))
{
perror("bind()");
return 1;
}
if(listen(s,10))//Listen for connections
{
perror("listen()");
return 1;
}
int size=sizeof(sin);
if((s2=accept(s,(struct sockaddr *)&sin, &size) < 0))//Accept connections
{
perror("accept()");
return 1;
}
printf("\nConnected to %s[%d]",inet_ntoa(sin.sin_addr),sin.sin_port);
do
{
ret = recv(s2, msg, 10000, 0);
//Waits until a message is recieved...
printf("Message : %s\n", msg);
}
while(msg[0]!='0');
close(s);//Close Socket
return 0;
}
Thats all
Tested and proved working on Fedora Core 6.
Do let me know your results and comments.....
To know more about the functions check the Linux Manual for each function.
Check out... (UDP Transciever)
:)
0 comments:
Post a Comment