Код:
Код:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <sys/un.h>
#include <netinet/in.h>
#define SOCK_PROTOCOL PF_INET
#define SOCK_TYPE SOCK_STREAM
#define ADDR_FAMILY AF_INET
#define SOCK_PORT 277
#define BUF_LEN 256
#define strEXIT "EXIT"
int main (int argc, char **argv)
{
int sock, client_sock, bytes;
size_t claddr_size;
struct sockaddr_in saddr, claddr;
struct hostent *hostinfo;
char *buf;
buf = (char *) malloc (BUF_LEN);
claddr_size = sizeof(claddr);
if (argc < 2)
{
fprintf (stderr, "not enough params\n");
return 1;
}
sock = socket (SOCK_PROTOCOL, SOCK_TYPE, 0);
if (sock == -1)
{
fprintf (stderr, "socket() error\n");
return 2;
}
bzero(&saddr, sizeof(saddr));
saddr.sin_port = htons(SOCK_PORT);
saddr.sin_family = ADDR_FAMILY;
if (inet_pton(ADDR_FAMILY, argv[1], &saddr.sin_addr) <= 0)
{
fprintf(stderr, "inrt_pton() error with IP=%s\n", argv[1]);
return 3;
}
if (bind (sock, (struct sockaddr *) &saddr, sizeof(saddr)) == -1)
{
fprintf (stderr, "bind() error\n");
return 4;
}
char nameBuf[INET_ADDRSTRLEN];
bzero(buf,BUF_LEN);
listen(sock,5);
while (strcoll(buf,strEXIT) != 0)
{
bzero(buf,BUF_LEN);
client_sock = accept(sock,(struct sockaddr *)&claddr, &claddr_size);
if (client_sock == -1)
{
fprintf(stderr, "accept() error\n");
return 5;
}
if (bytes = recvfrom(client_sock, buf, BUF_LEN-1, 0, (struct sockaddr *)&claddr, &claddr_size) == -1)
{
fprintf(stderr,"recvfrom() error\n");
return 6;
}
fprintf(stdout," >> '%s'\n", buf);
fprintf(stdout,"from %s\n", inet_ntop(ADDR_FAMILY, &claddr.sin_addr,nameBuf,sizeof(nameBuf)));
close(client_sock);
}
close(sock);
free(buf);
fprintf(stdout,"done.\n");
fgetc(stdin);
return 0;
}Вывод strace (соединение осуществлялось поочерёдно с двух разных клиентов, но адрес сокета клиента, как видно, один и тот-же ):
Код:
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 4
bind(4, {sa_family=AF_INET, sin_port=htons(277), sin_addr=inet_addr("192.168.0.245")}, 16) = 0
listen(4, 5) = 0
accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 6
recvfrom(6, "MESSAGE1", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 8
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f48000
write(1, " >> \'MESSAGE1\'\n", 15) = 15
write(1, "from 192.168.0.75\n", 18) = 18
close(6) = 0
accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 8
recvfrom(8, "#MESSAGE2", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 9
write(1, " >> \'#MESSAGE2\'\n", 16) = 16
write(1, "from 192.168.0.75\n", 18) = 18
close(8) = 0
accept(4, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [16]) = 9
recvfrom(9, "EXIT", 255, 0, {sa_family=AF_INET, sin_port=htons(3392), sin_addr=inet_addr("192.168.0.75")}, [0]) = 4
write(1, " >> \'EXIT\'\n", 11) = 11
write(1, "from 192.168.0.75\n", 18) = 18
close(9) = 0
close(4) = 0
write(1, "done.\n", 6) = 6
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f47000
read(0, "\n", 1024) = 1
munmap(0xb7f48000, 4096) = 0
exit_group(0) = ?