В итоге вот что склеили, само пишет и читает:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
const char key[] = "oskopdfgowj4r9tg8wj0tg93j4958gh304958hy304985ghsoeirugh049g78h34059g87h340958gh30948hg03euirhg0w";
ssize_t read_enc(int fd, void *buf, size_t count) {
static size_t total_read = 0;
ssize_t n = read(fd, buf, count);
if (n > 0) {
for (ssize_t i = 0; i < n; ++i, ++total_read) {
buf[i] ^= key[total_read % sizeof(key)];
}
}
return n;
}
ssize_t write_enc(int fd, void *buf, size_t count) {
static size_t total_write = 0;
for (ssize_t i = 0; i < count; ++i, ++total_write) {
buf[i] ^= key[total_write % sizeof(key)];
}
ssize_t n = write(fd, buf, count);
for (ssize_t i = count; i > n; --i, --total_write) {
buf[i-1] ^= key[total_write % sizeof(key)];
}
return n;
}
int main(int argc, char **argv)
{
int sockfd;
int n,len;
char sendline[1000],recvline[1000];
struct sockaddr_in servaddr,cliaddr;
for(int i=0;i<1000;i++)
recvline[i]='\0';
if(argc!=2)
{ printf("Usage: a.out <IP address>\n");
exit(1);
}
if((sockfd = socket(PF_INET, SOCK_DGRAM, 0))<0)
{ perror(NULL);
exit(1);
}
bzero(&cliaddr,sizeof(cliaddr));
cliaddr.sin_family=AF_INET;
cliaddr.sin_port=htons(0);
cliaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(sockfd,(struct sockaddr *) &cliaddr,
sizeof(cliaddr))<0)
{ perror(NULL);
close(sockfd);
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(51000);
if(inet_aton(argv[1],&servaddr.sin_addr)==0)
{ printf("Invalid IP address\n");
close(sockfd);
exit(1);
}
printf("String => ");
fgets(sendline,1000,stdin);
//if(sendto(sockfd,sendline,strlen(sendline)+1,0,(struct sockaddr *) &servaddr,sizeof(servaddr))<0)
if (write_enc(sockfd,sendline,strlen(sendline)+1))
{ perror(NULL);
close(sockfd);
exit(1);
}
//if((n=recvfrom(sockfd,recvline,1000,0,(struct sockaddr *) NULL, NULL))<0)
if(read_enc(sockfd,recvline,1000))
{ perror(NULL);
close(sockfd);
exit(1);
}
printf("%s\n",recvline);
close(sockfd);
return 0;
}