Демонстрация на програмиране на сокети под Linux. В конкретния случай са реализирани програмните фрагменти на клиент и сървър:
server.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<error.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>
#define MAX_CLIENTS 20
#define BUFFER 1024
main(int argc, char **argv)
{
struct sockaddr_in server, client;
int sock, connection, data_len, struct_len = sizeof(struct sockaddr_in);
char data[BUFFER];
if((sock = socket(AF_INET, SOCK_STREAM,0)) == -1)
{
perror("Socket error.");
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[1]));
server.sin_addr.s_addr = INADDR_ANY;
bzero(&server.sin_zero,8);
if((bind(sock,(struct sockaddr *)&server,struct_len)) == -1)
{
perror("Bind error.");
exit(-1);
}
if((listen(sock,MAX_CLIENTS)) == -1)
{
perror("Listen error.");
exit(-1);
}
while(1)
{
pid_t pid = fork();
if((connection = accept(sock,(struct sockaddr *)&client,&struct_len)) == -1)
{
perror("Accept error.");
exit(-1);
}
data_len = 1;
while(data_len)
{
data_len = recv(connection, data, BUFFER, 0);
if(data_len)
{
send(connection, data, data_len, 0);
data[data_len] = '\0';
printf("%s",data);
}
}
close(connection);
}
close(sock);
}
client.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<strings.h>
#include<arpa/inet.h>
#define ERROR -1
#define BUFFER 1024
main(int argc, char **argv)
{
struct sockaddr_in server;
int sock, len;
char input[BUFFER], output[BUFFER],data[BUFFER];
char *whoami=getlogin();
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
{
perror("Socket error.");
exit(-1);
}
server.sin_family = AF_INET;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
bzero(&server.sin_zero, 8);
if((connect(sock,(struct sockaddr *)&server,
sizeof(struct sockaddr_in))) == ERROR)
{
perror("Connect error.");
exit(-1);
}
while(1)
{
fgets(input, BUFFER, stdin);
strcpy(data, whoami);
strcat(data, ": ");
strcat(data, input);
send(sock, data, strlen(data), 0);
len = recv(sock, output, BUFFER, 0);
output[len] = '\0';
printf("Echo: %s",output);
}
close(sock);
}