The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"клиент - сервер"
Отправлено chip, 13-Дек-05 11:58 
Сервер:
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>


#define _SOCK_PATH "/tmp/srv.sock"

int
srv(int clientfd) {
  while (1) {
    int length;
    char *text;

    /* $-1¨´¨Û¨Ø¨Ý¨Ð ¨á¨Þ¨Þ¨Ñ¨é¨Õ¨Ý¨Ø¨ï */
    if (read(clientfd, &length, sizeof(&length)) == 0)
      return 0;
    text = (char *) malloc(length);
    read(clientfd, text, length);
    fprintf(stderr, "%s\n", text);
    free(text);
    if (!strcasecmp(text, "quit"))
      return 1;
  }
}
    

int
main(int argc, char *argv[]) {
  int sockfd, rv, quit_flag;
  struct sockaddr_un srv_addr;

  sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
  if (sockfd < 0)
    err(EX_UNAVAILABLE, "socket");
  unlink(_SOCK_PATH);
  memset(&srv_addr, 0, sizeof(struct sockaddr_un));
  srv_addr.sun_family = AF_LOCAL;
  strncpy(srv_addr.sun_path, _SOCK_PATH, strlen(_SOCK_PATH) + 1);
  rv = bind(sockfd, (struct sockaddr *) &srv_addr, SUN_LEN(&srv_addr));
  if (rv < 0) {
    close(sockfd);
    err(EX_UNAVAILABLE, "bind");
  }
  /* $-1¨¾¨Ö¨Ø¨Ô¨Ð¨Ý¨Ø¨Õ ¨×¨Ð¨ß¨à¨Þ¨á¨Þ¨Ò */
  listen(sockfd, 5);

  do {
    struct sockaddr_un client_addr;
    socklen_t client_addr_len;
    int clientfd;

    clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
    quit_flag = srv(clientfd);
    close(clientfd);
  } while (!quit_flag);
  close(sockfd);
  unlink(_SOCK_PATH);

  return 0;
}


Клиент:

#include <err.h>
#include <stdio.h>
#include <string.h>
#include <sysexits.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>

#define _SOCK_PATH "/tmp/srv.sock"

int
main(int argc, char *argv[]) {
  int sockfd, rv;
  const char * const message = argc > 1 ? argv[1] : "Null message";
  struct sockaddr_un client_addr;

  sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
  if (sockfd < 0)
    err(EX_UNAVAILABLE, "socket");
  memset(&client_addr, 0, sizeof(struct sockaddr_un));
  client_addr.sun_family = AF_LOCAL;
  strncpy(client_addr.sun_path, _SOCK_PATH, strlen(_SOCK_PATH) + 1);
  rv = connect(sockfd, (struct sockaddr *) &client_addr, SUN_LEN(&client_addr));
  if (rv < 0)
    err(EX_UNAVAILABLE, "connect");

  do {
    int length = strlen(message) + 1;
    write(sockfd, &length, sizeof(length));
    write(sockfd, message, length);
  } while (0);
  close(sockfd);
  
  return 0;
}

Запускаешь сначала сервер, он начинает прослушивать /tmp/srv.sock. Затем запускаешь клиент передав ему в качестве аргумента произвольную строку (она будет послана на сервер).

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру