Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > клиент сервер TCP на С


Автор: kill12 10.6.2009, 21:00
Всем привет! Нужно написать 2 простенькие программы на С, осуществляющие передачу сообщения между собой (эмуляция клиент - сервер) по средствам протокола TCP. Может у кого что есть? Всем огромное спасибо!

Автор: Alca 10.6.2009, 21:21
http://forum.vingrad.ru/forum/topic-262285.html

Добавлено через 52 секунды
http://forum.xakep.ru/m_1260960/tm.htm
http://www.softtime.ru/cpp/read.php?id_forum=1&id_theme=793

Добавлено через 2 минуты и 45 секунд
http://netcode.ru/cpp/?lang=&katID=19&skatID=169&artID=5045

Добавлено через 2 минуты и 57 секунд
http://www.hackzona.ru/hz.php?name=News&file=article&sid=9281

Добавлено через 4 минуты и 27 секунд
http://www.sources.ru/cpp/cpp_remote_admin_src.shtml

Автор: andrew_121 10.6.2009, 23:43
Цитата(kill12 @  10.6.2009,  21:00 Найти цитируемый пост)
Нужно написать 2 простенькие программы на С

Пиши. Я не против.

Автор: Vampir41k 11.6.2009, 11:56
сервер
Код

#include <ctype.h>
#include <winsock.h>
#include <stdio.h>

#define SIZE sizeof(struct sockaddr_in)

DWORD WINAPI child(void *param);

main ()
{
  int sockfd;
  int rc;
  struct sockaddr_in server = {AF_INET, 7000, INADDR_ANY}, client;
  WSADATA WSAData;
  int newsockfd, size;

  DWORD child_id;

  rc = WSAStartup (MAKEWORD(1, 1), &WSAData);
  if(rc != 0){
    perror("WSAStartup  Error");
    return 1;
  }
/* Создает сокет */
  if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1){
    perror ("socket call error");
    exit (1);
  }

  /* Связает адрес с сокетом */
  if (bind (sockfd, (struct sockaddr *) &server, SIZE) == -1){
    perror ("bind call error");
    exit (1);
  }

  /* Включает прием соединений */
  if (listen (sockfd, 5) == -1){
    perror ("listen call error");
    exit (1);
  }

  for (;;){
    /* Принимает запрос на соединение */
    if ((newsockfd = accept (sockfd, (struct sockaddr *) &client, &size)) == -1){
       perror ("accept call error");
       continue;
    }

    printf("Request from %s, processing\n", inet_ntoa(client.sin_addr));
    /* Создает дочерний процесс для работы с соединением */
    CreateThread(NULL,0,child,&newsockfd,0,&child_id);
  }
  //WSACleanup();
}
DWORD WINAPI child(void *param){
  char c;
  int newsockfd;

  printf("Run child\n");
  newsockfd=*(int *)param;
  while (recv (newsockfd, &c, 1, 0) > 0){
     c = toupper (c);
     send (newsockfd, &c, 1, 0);
  }
  /* После того, как клиент прекратит передачу данных,
   * сокет может быть закрыт и дочерний процесс
   * завершает работу */
  closesocket (newsockfd);
  printf("child exited\n");
  ExitThread(0);
  return 0;
}



клиент
Код

#include <ctype.h>
#include <stdio.h>
#include <winsock.h>

#define SIZE sizeof(struct sockaddr_in)

main ()
{
  int sockfd;
  int c, rc;
  struct sockaddr_in server = {AF_INET, 7000};
  WSADATA WSAData;

 rc = WSAStartup (MAKEWORD(1, 1), &WSAData);
  if(rc != 0)
  {
    perror("WSAStartup  Error");
    return 1;
  }

  /* Преобразовывает и сохраняет IP адрес сервера */
  server.sin_addr.s_addr = inet_addr ("127.0.0.1");

  /* Создает сокет */
  if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror ("socket call error");
    exit (1);
  }

  /* Соединяет сокет с сервером */
  if (connect (sockfd, (struct sockaddr *) &server, SIZE) == -1)
  {
    perror ("connect call error");
    exit (1);
  }
  /* Цикл обмена данными с сервером */
  for (rc = '\n';;)
  {
    if (rc == '\n')
      printf ("Input characters\n");
    c = getchar ();
    if (c==-1)
      break;
    send (sockfd, (char*)&c, 1, 0);
    if (recv (sockfd, (char*)&rc, 1, 0) > 0)
      printf ("%c", rc);
    else
    {
      printf ("Server is not response\n");
      break;
    }
  }
  closesocket (sockfd);
  WSACleanup();
  return 1;
}

Автор: andrew_121 11.6.2009, 17:01
Цитата(Vampir41k @  11.6.2009,  11:56 Найти цитируемый пост)
#define SIZE sizeof(struct sockaddr_in)

Как-то не очень правильно...
Назови ее уже понятнее. К примеру:
Код

#define SIZEOF_SOCKADDRESS sizeof(struct sockaddr_in)

Но тогда пропадает смысл в дефайне.
В общем, дело вкуса.

Автор: bourne 17.7.2009, 21:15
Доброго времени суток, господа!
Как из функции child получить доступ к Builder-овской форме? Как, например, вывести в Memo принятое сообщение?

Автор: SVN74 17.7.2009, 21:29
Цитата(bourne @  17.7.2009,  21:15 Найти цитируемый пост)
Как из функции child получить доступ к Builder-овской форме? Как, например, вывести в Memo принятое сообщение? 

Надежней всего SendMessage или PostMessage взависимости от нужды

Автор: Andrew121 18.7.2009, 03:00
Цитата(Vampir41k @  11.6.2009,  11:56 Найти цитируемый пост)
  ExitThread(0);

Это здесь лишнее.

Автор: bourne 18.7.2009, 22:59
Цитата(SVN74 @  17.7.2009,  21:29 Найти цитируемый пост)
Надежней всего SendMessage или PostMessage взависимости от нужды 

SendMessage(Form1->Memo1->Handle, WM_SETTEXT, 0, "Done!");
?

Автор: andrew_121 19.7.2009, 07:01
bourne, Да.
А что не так?

Автор: bourne 19.7.2009, 09:54
Цитата(andrew_121 @  19.7.2009,  07:01 Найти цитируемый пост)
А что не так? 

Я передавал форме ЮникодСтринг, а нужен был лонг smile
Сейчас вроде все работает. Спасибо

Автор: andrew_121 19.7.2009, 10:53
Цитата(bourne @  19.7.2009,  09:54 Найти цитируемый пост)
Я передавал форме ЮникодСтринг, а нужен был лонг

А что такое "лонг" ?

Автор: bourne 19.7.2009, 14:09
Цитата(andrew_121 @  19.7.2009,  10:53 Найти цитируемый пост)
А что такое "лонг" ? 

лонг == long smile
P.S. кстати, может кто знает как выглядит обработчик для Send/PostMessage? smile

Автор: bourne 10.8.2009, 19:48
 smile  smile  smile 
Пытаюсь вести лог всех подключившихся клиентов. Запись вида "IP:port". Вот Ип норм записывается, а вот порт какой-то страшный. Куски кода:
Код

typedef struct tcp_header
{
    unsigned short src_port;
    unsigned short dst_port;
/*....*/
}
    tcp = (tcp_header *)(data + 14 + (ip->len) * 4);
    dport = ntohs(tcp->dst_port);
/* ... */

В dst_port вместо, к примеру, числа 80 я вижу 29808, а в dport заносится другое число, но не 80 :( Иногда вобще 0 выдает.
Уж и не знаю куда смотреть.
smile 

Автор: jonie 10.8.2009, 19:57
Цитата
Код

typedef struct tcp_header
{
    unsigned short src_port;
    unsigned short dst_port;
/*....*/
}
    tcp = (tcp_header *)(data + 14 + (ip->len) * 4);
    dport = ntohs(tcph->dst_port);
/* ... */


а tcph это че за байда? где ты ее инициализируешь? и вообще у тебя зачем своя tcp_header, если 99% в стандартных хедерах уже все есть и с нормальной упаковкой (pragma pack(1)) ?

Автор: bourne 10.8.2009, 20:15
Цитата(jonie @  10.8.2009,  19:57 Найти цитируемый пост)
а tcph это че за байда? 

Очепятка  smile  Там не tcph, а tcp

Цитата(jonie @  10.8.2009,  19:57 Найти цитируемый пост)
и вообще у тебя зачем своя tcp_header, если 99% в стандартных хедерах уже все есть

Я начал искать описание в станд.хедерах, решил не тратить время и написать "свое" smile

Автор: jonie 10.8.2009, 20:26
Цитата
Я начал искать описание в станд.хедерах, решил не тратить время и написать "свое" 

поздравляю! Вы изобрели http://www.google.com/search?client=opera&rls=ru&q=%D0%B2%D0%B5%D0%BB%D0%BE%D1%81%D0%B8%D0%BF%D0%B5%D0%B4+%D1%81+%D0%BA%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%BC%D0%B8+%D0%BA%D0%BE%D0%BB%D0%B5%D1%81%D0%B0%D0%BC%D0%B8&sourceid=opera&ie=utf-8&oe=utf-8.
как минимум вы не указали упаковку 
#pragma pack(push)
#pragma pack(1) 
struct...
#pragma pack(pop)

перед объявлением структуры......

Автор: bourne 10.8.2009, 20:37
Добавил... Вылетает в начале работы с ошибкой:
Цитата

Project Project1.exe raised exception class EOSError with message 'System Error. Code:5. Отказано в доступе'

Автор: bourne 11.8.2009, 18:50
Ошибка найдена.

jonie, спасибо за:
Цитата

как минимум вы не указали упаковку 

теперь хотя бы знаю что это и для чего нужно smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)