Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

ввод и вывод команды через сокеты linux

595
09 октября 2012 года
Charley
170 / / 16.08.2011
По книге "сетевое программирование в unix" сделал tcp клиент и сервер. Подскажите как сделать так, чтобы клиент ожидал ввода команды, а сервер ее выполнял и результат показывал клиенту?
Пробовал делать в сервере так
dup2(socket,1);
dup2(socket, 0);
execl("/bin/sh", "in.telnetd", 0);.
Но скажите как реализовать ввод и вывод команд в клиенте?
Прикрепленные файлы:
  • Покажи что уже умеет твой клиент и что уже умеет твой сервер от Romik, 09 октября 2012 года
595
10 октября 2012 года
Charley
170 / / 16.08.2011
Здесь не получается ни прикрепить файлы, ни вставить код. Вот ссылка скачать исходники unixclient.c клиент, unixserver.c сервер.
4
10 октября 2012 года
mike
3.7K / / 01.10.2002
Цитата: 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;
}
Прикрепленные файлы:
2 Кб
Загрузок: 286

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог