Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: програмируем сеть :D  (Прочитано 1582 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн merl

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Да Здравствует Великий Народ
    • Просмотр профиля
програмируем сеть :D
« : 01 Сентября 2008, 18:09:56 »
програмирования сети предлагаю учитса вместе ибо сам мало што шарю но очень хочу
значит так вот простенькие исходники клиента и сервера которые работают на локальной машыне через возвратный адрес но можно и через сеть
пример взят с книги Йон Снейдер - Эффективное программирование TCP-IP хорошая и умная книга

пример клиента:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string>

using namespace std;

int main( void ) {
struct sockaddr_in peer;
 int s ;
 int rc;
 int a;
 char buf [ 1 ];
 peer. sin_family = AF_INET;
 peer.sin_port = htons( 7500 );
 peer.sin_addr.s_addr = inet_addr( "127.0.0.1" );

 s = socket ( AF_INET, SOCK_STREAM, 0 );
cin >> a;

if (s < 0) {
cout<< "ошибка вызова socket\n" ;
exit( 1 ); }

rc = connect( s, ( struct sockaddr * )&peer, sizeof( peer ) );
 if (rc) {
cout<< "ошибка вызова connect\n" ;
exit( 1 ); }

rc = send( s, "1" , 1, 0 );
if (rc <= 0) {
cout<< "ошибка вызова send\n"  ;
exit( 1 ) ; }

rc = recv( s, buf, 1, 0 ) ;
if ( rc <= 0 ) cout<<  "ошибка вызова recv\n" ;
else
cout<< "сервер передал   " << buf[ 0 ] <<"\n" ;
exit( 0 ); }


пример сервера :

  #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <string>
using namespace std;

int main (void) {
struct sockaddr_in local;
int s;
int s1;
int rc;
char buf [ 1 ];
local.sin_family = AF_INET;
local.sin_port = htons( 7500 ) ;
local.sin_addr.s_addr = htonl( INADDR_ANY );

s = socket( AF_INET, SOCK_STREAM, 0 );
if ( s < 0 ) {
cout<<"ошибка вызова socket\n" ;
exit( 1 ); }

rc = bind(s, (struct sockaddr * )&local, sizeof ( local ) );
if ( rc < 0 ) {
cout<<"ошибка вызова bind\n" ;
exit( 1 ); }

rc = listen( s, 5 );
if ( rc ) {
cout<< "ошибка вызова listen\n" ;
exit( 1 ); }

s1 = accept(s, NULL, NULL );
if ( s1 < 0 ) {
cout<< "ошибка вызова accept\n" ;
exit( 1 ); }

rc = recv( s1, buf, 1, 0 );
if ( rc <= 0 ) {
cout<< "ошибка вызова recv\n" ;
exit( 1 ); }

cout<< "клиент передал    " << buf[ 0 ] <<"\n";
 rc = send( s1, "2", 1, 0 );
 if ( rc <= 0 ) {
cout<< "ошибка вызова send\n" ;    }
 exit( 0 );

все компилитса и работает, сначала запускаем сервер потом клиент, сервер получает от клиента бит и отправляет клиенту другой бит








« Последнее редактирование: 01 Сентября 2008, 18:51:19 от merl »

Оффлайн merl

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Да Здравствует Великий Народ
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #1 : 01 Сентября 2008, 18:17:55 »
для тех кто зает..... почему оно не компилитса если в функцию передачи вместо "1"
35 rc = send( s, "1" , 3, 0 ); задать переменную  35 rc = send( s, a , 3, 0 );
я так понимаю функцыя send передайот только константу, но почему!!?? и каким образом можно передать переменную

andriy@akva:~/Desktop$ g++ g.c -o g.o
g.c: In function ‘int main()’:
g.c:35: error: invalid conversion from ‘int’ to ‘const void*’
g.c:35: error:   initializing argument 2 of ‘ssize_t send(int, const void*, size_t, int)’
« Последнее редактирование: 01 Сентября 2008, 18:59:02 от merl »

Оффлайн digiwhite

  • Активист
  • *
  • Сообщений: 732
  • http://www.welinux.ru
    • Просмотр профиля
    • http://www.welinux.ru
Re: програмируем сеть :D
« Ответ #2 : 01 Сентября 2008, 18:37:48 »
Для начала, неплохо было бы использовать тэг "code". А то читать невозможно.

Updated: и русский, русский язык чуть-чуть поправить....
« Последнее редактирование: 01 Сентября 2008, 18:40:45 от digiwhite »
Социальная сеть не фанатично настроенных линуксойдов - http://www.welinux.ru

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #3 : 01 Сентября 2008, 19:18:01 »
для тех кто зает..... почему оно не компилитса если в функцию передачи вместо "1"
35 rc = send( s, "1" , 3, 0 ); задать переменную  35 rc = send( s, a , 3, 0 );
я так понимаю функцыя send передайот только константу, но почему!!?? и каким образом можно передать переменную

andriy@akva:~/Desktop$ g++ g.c -o g.o
g.c: In function ‘int main()’:
g.c:35: error: invalid conversion from ‘int’ to ‘const void*’
g.c:35: error:   initializing argument 2 of ‘ssize_t send(int, const void*, size_t, int)’

что такое "a"? (как объявлена?)

ЗЫ сдается мне, перед программированием сети придется поднабраться опыта в C...

Оффлайн merl

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Да Здравствует Великий Народ
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #4 : 02 Сентября 2008, 15:21:45 »
Цитировать
что такое "a"?  (как объявлена?)

ЗЫ сдается мне, перед программированием сети придется поднабраться опыта в C...
  :o  int a;  переменная а обьявлена как целое число, да в прочим я как только ее не обьявлял и строкой и с плавающей точкой, но всьорано компилитса не хочет
помогите розобратса пожалуйста.

 :o и еще вопрос... допустим клиент передал бит сервер принял програма выполнилась , но если я пробую сразу  опять запустить сервер он не запускается  так как  ошибка вызова bind как с этим справится 

  :D  а насчот изучения С и С++ тут такая штука.. учу паралельно, все и сразу опыту мизер но очень нужно поднабраться практических умений   
« Последнее редактирование: 02 Сентября 2008, 15:50:28 от merl »

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #5 : 02 Сентября 2008, 17:03:14 »
и еще вопрос... допустим клиент передал бит сервер принял програма выполнилась , но если я пробую сразу  опять запустить сервер он не запускается  так как  ошибка вызова bind как с этим справится 
внимательнее читай снейдера :) сокеты закрывать надо перед завершением программы (close())

int a;  переменная а обьявлена как целое число, да в прочим я как только ее не обьявлял и строкой и с плавающей точкой, но всьорано компилитса не хочет
помогите розобратса пожалуйста.
тут как раз перез практическими знаниями неплохо бы иметь теоретические сведения.
берем сигнатуру функции send:
int  send(int  s,  const  void *msg, int len, unsigned int flags);с первым и последним аргументом, вроде, худо-бедно ясно, смотрим на второй и третий.

const void * msg - это указатель на область памяти, содержащую данные, которые надо передать через сокет. const означает, что функция send не внутри себя не может изменять эти данные, только считывать.

int len - это размер данных (в байтах, кстати, а не в битах), которые расположены по адресу msg.

Теперь разберемся, что надо сделать, чтобы передать сокету числовое значение (твой int a ;))
int a = 10;
rc = send(s, &a, sizeof(int), 0);
Найди отличия со своим вариантом и разберись в них.

Оффлайн merl

  • Автор темы
  • Новичок
  • *
  • Сообщений: 13
  • Да Здравствует Великий Народ
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #6 : 02 Сентября 2008, 18:41:47 »
ура ура получилось !!! я передал переменную !!!!! пасибо большое при большое есть добрые люди всьотаки !!
но вот ерунда я немогу принять ее серверним приложением хотя зделал некие изменения кода не помогло

18  char buf [ 5 ];
43  rc = recv( s1, buf, sizeof(int), 0 );//пробовал также варианты sizeof(buf) и просто 5
 и буфер читаю цыклом
47  for (i=0; i<5; i++){cout<<  "клиент передал   " << buf[ i ] <<"\n";} 

когда передаю константу скажем  rc = send(s, "1234" ,sizeof(int), 0); принимаю:
andriy@akva:~/Desktop$ ./g1.o
клиент передал   1
клиент передал   2
клиент передал   3
клиент передал   4
клиент передал   �

когда передаю переменную скажем
int a = 12;
 rc = send(s, &a ,sizeof(int), 0);
получаю :
клиент передал   

клиент передал   
клиент передал   
клиент передал   
клиент передал   �

помогите новичку пожалуста ищьораз  :coolsmiley: :o кстати што значит � такой символ??
« Последнее редактирование: 02 Сентября 2008, 18:43:58 от merl »

Оффлайн axe

  • Старожил
  • *
  • Сообщений: 1203
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #7 : 02 Сентября 2008, 20:18:29 »
фсио.... учить С - "неделю, не меньше" (с) Кролик

тонкий намек: почему ты send'ишь int, а recv'ишь char[5]?

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: програмируем сеть :D
« Ответ #8 : 03 Сентября 2008, 07:07:47 »
фсио.... учить С - "неделю, не меньше" (с) Кролик

тонкий намек: почему ты send'ишь int, а recv'ишь char[5]?
это не лечится =) ну не понимает человек что он нихрена не сделает пока не выучит язык.

merl, все твои дурацкие вопросы и дурацкие проблемы от того что ты начал НЕ С ТОЙ КНИЖКИ!
Возьми азбуку! После нее можно будет брать книжку по Си и только потом по сетям.

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.