ввод и вывод команды через сокеты linux
Пробовал делать в сервере так
dup2(socket,1);
dup2(socket, 0);
execl("/bin/sh", "in.telnetd", 0);.
Но скажите как реализовать ввод и вывод команд в клиенте?
- Покажи что уже умеет твой клиент и что уже умеет твой сервер от Romik, 09 октября 2012 года
скачать исходники unixclient.c клиент, unixserver.c сервер.
Здесь не получается ни прикрепить файлы, ни вставить код. Вот ссылка
Цитата: Charley
Здесь не получается ни прикрепить файлы, ни вставить код. Вот ссылка скачать исходники unixclient.c клиент, unixserver.c сервер.
Что я делаю не так?
Код:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
ssize_t writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
void Writen(int fd, void *ptr, size_t nbytes)
{
if (writen(fd, ptr, nbytes) != nbytes)
strerror("writen error");
}
void str_echo(int sockfd)
{
ssize_t n;
int MAXLINE = 256;
char buf[MAXLINE];
for (;;)
{
if ((n=read(sockfd, buf, MAXLINE)) > 0)
return;
Writen(sockfd, buf, n);
}
}
/*void str_cli(FILE *fp, int sockfd)
{
int MAXLINE=256;
char sendline[MAXLINE], recvline[MAXLINE];
while (fgets(sendline, MAXLINE, fp) != NULL)
{
Writen(sockfd, sendline, strlen(sendline));
if (readline(sockfd, recvline, MAXLINE) == 0)
strerror("str_cli termineted");
fputs(recvline, stdout);
}
}
*/
int main(int argc, char **argv)
{
int sockfd, fd, SERV_PORT=9877, count=1;
struct sockaddr_in servaddr;
char mesg[256];
if (argc != 2)
strerror("need ipaddress");
sockfd=socket(AF_INET, SOCK_STREAM, 0);
bzero((struct sockaddr*)&servaddr, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET, argv[1], (struct sockaddr*)&servaddr.sin_addr);
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
while(count>0)
{
count=recv(sockfd, mesg, 256, 0);
printf("%s", mesg);
}
close(fd);
return 0;
}
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
ssize_t writen(int fd, const void *vptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
const char *ptr;
ptr = vptr;
nleft = n;
while (nleft > 0) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0) {
if (errno == EINTR)
nwritten = 0; /* and call write() again */
else
return(-1); /* error */
}
nleft -= nwritten;
ptr += nwritten;
}
return(n);
}
/* end writen */
void Writen(int fd, void *ptr, size_t nbytes)
{
if (writen(fd, ptr, nbytes) != nbytes)
strerror("writen error");
}
void str_echo(int sockfd)
{
ssize_t n;
int MAXLINE = 256;
char buf[MAXLINE];
for (;;)
{
if ((n=read(sockfd, buf, MAXLINE)) > 0)
return;
Writen(sockfd, buf, n);
}
}
/*void str_cli(FILE *fp, int sockfd)
{
int MAXLINE=256;
char sendline[MAXLINE], recvline[MAXLINE];
while (fgets(sendline, MAXLINE, fp) != NULL)
{
Writen(sockfd, sendline, strlen(sendline));
if (readline(sockfd, recvline, MAXLINE) == 0)
strerror("str_cli termineted");
fputs(recvline, stdout);
}
}
*/
int main(int argc, char **argv)
{
int sockfd, fd, SERV_PORT=9877, count=1;
struct sockaddr_in servaddr;
char mesg[256];
if (argc != 2)
strerror("need ipaddress");
sockfd=socket(AF_INET, SOCK_STREAM, 0);
bzero((struct sockaddr*)&servaddr, sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(SERV_PORT);
inet_pton(AF_INET, argv[1], (struct sockaddr*)&servaddr.sin_addr);
connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));
while(count>0)
{
count=recv(sockfd, mesg, 256, 0);
printf("%s", mesg);
}
close(fd);
return 0;
}