Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
1

Передача текста по сокетам

10.06.2017, 11:57. Показов 1628. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте Уважаемые,

Основная ОС винда 8-ая, установил виртуальную ОС Убунту через VMware. Вопрос такой, можно ли написать клиента на винде, а сервера на убунту и реализовать обмен сообщениями между ними? Если да, то можно ли это осуществить на сокетах?

И еще вопрос, может это и другой топик, но все же... Виртуальная машина и Основная сичтаются как отдельные устройства и имеют различные адреса? Если можно на пальцах господа, знания в комп. сетях скудные.

Заранее благодарен всем друзья!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.06.2017, 11:57
Ответы с готовыми решениями:

Передача русского текста по сокетам
Доброго времени суток! В Delphi XE5 использую компоненты serversocket и clientsocket. При передаче...

Передача по сокетам данные
Всех приветствую! Я делаю на C# передачу данных по сокетам, пытаюсь передать картинку размерами...

Передача информации по сокетам
Здравствуйте. Хочу сделать клиент\сервер'ную программу, которая через сокеты через протокол TCP...

Передача больших файлов по сокетам
Как можно решить проблему? У меня на входе массив байт разного размера. Передаю по сокетам второй...

13
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
10.06.2017, 12:46 2
Цитата Сообщение от Axel92 Посмотреть сообщение
Вопрос такой, можно ли написать клиента на винде, а сервера на убунту и реализовать обмен сообщениями между ними?
Элементарно.
Берёте любой пример клиент-серверного кода (лучше из Linux). Главное, не забываем (не пропускаем) функции преобразования сетевого порядка байт: hton(), ntoh() и т.д. - сетевой порядок у Windows и Linux отличаются.
Цитата Сообщение от Axel92 Посмотреть сообщение
Виртуальная машина и Основная сичтаются как отдельные устройства и имеют различные адреса?
Они не считаются устройствами. Но у них есть сетевые интерфейсы, взаимодействующие между собой. И сетевые интерфейсы на гостевой машине и на хостовой машине имеют, естественно, разные IP. Но принадлежащие (по маске) к одной подсети.
1
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
10.06.2017, 13:40  [ТС] 3
Спасибо за ваш ответ Olej!

Не могли бы вы прояснить еще пару моментов... Нашел и реализовал клиент-сервера на ВМ Убунту, рабоатет!
Даже понятия не имею как можно этот же сервер написать на винде, т.к. сокеты там кажется по другому пишутся.

Плюс не знаю какие там айпи прописывать.

Сервер
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
 
int main(void)
{
  int listenfd = 0,connfd = 0;
  
  struct sockaddr_in serv_addr;
 
  char sendBuff[1025];  
  int numrv;  
 
  listenfd = socket(AF_INET, SOCK_STREAM, 0);
  printf("socket retrieve success\n");
  
  memset(&serv_addr, '0', sizeof(serv_addr));
  memset(sendBuff, '0', sizeof(sendBuff));
      
  serv_addr.sin_family = AF_INET;    
  serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
  serv_addr.sin_port = htons(5000);    
 
  bind(listenfd, (struct sockaddr*)&serv_addr,sizeof(serv_addr));
  
  if(listen(listenfd, 10) == -1){
      printf("Failed to listen\n");
      return -1;
  }     
  
  while(1)
    {      
      connfd = accept(listenfd, (struct sockaddr*)NULL ,NULL); // accept awaiting request
  
      strcpy(sendBuff, "Message from server");
      write(connfd, sendBuff, strlen(sendBuff));
 
      close(connfd);    
      sleep(1);
    } 
 
  return 0;
}
Клиент
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
 
int main(void)
{
  int sockfd = 0,n = 0;
  char recvBuff[1024];
  struct sockaddr_in serv_addr;
 
  memset(recvBuff, '0' ,sizeof(recvBuff));
  if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
    {
      printf("\n Error : Could not create socket \n");
      return 1;
    }
 
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_port = htons(5000);
  serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
  if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
    {
      printf("\n Error : Connect Failed \n");
      return 1;
    }
 
  while((n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
      recvBuff[n] = 0;
      if(fputs(recvBuff, stdout) == EOF)
    {
      printf("\n Error : Fputs error");
    }
      printf("\n");
    }
 
  if( n < 0)
    {
      printf("\n Read Error \n");
    }
 
  return 0;
}
П.С. Не ругайте сильно т.к. знания по сетям практически нулевые, но мне очень интересно
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
10.06.2017, 15:09 4
Цитата Сообщение от Axel92 Посмотреть сообщение
Не могли бы вы прояснить еще пару моментов... Нашел и реализовал клиент-сервера на ВМ Убунту, рабоатет!
Даже понятия не имею как можно этот же сервер написать на винде, т.к. сокеты там кажется по другому пишутся.
На выньде сокеты синтаксически записываются по-другому ... через задницу, как обычно.
Но суть остаётся та же.
Цитата Сообщение от Axel92 Посмотреть сообщение
Плюс не знаю какие там айпи прописывать.
IP гляньте в своём Linux командой:
Код
$ ip address
Или:
Код
$ ifconfig
0
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
10.06.2017, 15:51  [ТС] 5
Спасибо Olej, вбил в терминал команду то что мне выдало показано в приложенном скриншоте, посмотрите плз. Который из них мой айпи?

А как узнать айпи на выньде?

И если допустим я подключусь к другой сети вайфай поменяется ли мой айпи или айпи всегда один и тот же независимо от того к какой сети подключаешься?

Спасибо!
Миниатюры
Передача текста по сокетам  
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
10.06.2017, 17:34 6
Лучший ответ Сообщение было отмечено Axel92 как решение

Решение

Цитата Сообщение от Axel92 Посмотреть сообщение
вбил в терминал команду то что мне выдало показано в приложенном скриншоте, посмотрите плз. Который из них мой айпи?
192.168.160.128

Добавлено через 3 минуты
Цитата Сообщение от Axel92 Посмотреть сообщение
А как узнать айпи на выньде?
С большой вероятностью - 192.168.160.1 ... я не помню что там в VMware.
Можете ping на этот адрес из Linux и проверить.

Добавлено через 1 минуту
Цитата Сообщение от Axel92 Посмотреть сообщение
И если допустим я подключусь к другой сети вайфай поменяется ли мой айпи или айпи всегда один и тот же независимо от того к какой сети подключаешься?
Ну, во-первых, внаружу (к WiFi и т.д.) вы подключаетесь из выньды, через другой сетевой интерфейс, и с IP из другой подсети.
IP адреса в виртуальной сети у вас всегда останутся неизменными.
1
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
11.06.2017, 06:49  [ТС] 7
Спасибо огромное!

И последний вопрос, ввожу в cmd (уже на выньде) ipconfig выдает мне следующее зрелище(приложенный рисунок). Огромная куча айпи, как мне узнать какое из них мое айпи?
Миниатюры
Передача текста по сокетам  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.06.2017, 06:57 8
Цитата Сообщение от Axel92 Посмотреть сообщение
Огромная куча айпи, как мне узнать какое из них мое айпи?
На названия адаптеров посмотрите и на ответ выше.
0
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
11.06.2017, 07:12  [ТС] 9
Да, по ответу выше я понял что мой айпи 192.168.160.1.

Тут 2 ethernet адаптера один VMnet1 с айпи 192.168.136.1, другой VMnet8 с айпи 192.168.160.1. Как узнать который из них мой?
0
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
11.06.2017, 07:16  [ТС] 10
И почему когда я ищу свой айпи по гуглу сайты выдают мне вот такое вот:
Миниатюры
Передача текста по сокетам  
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
11.06.2017, 07:38 11
Цитата Сообщение от Axel92 Посмотреть сообщение
И почему когда я ищу свой айпи по гуглу сайты выдают мне вот такое вот:
Цитата Сообщение от Olej Посмотреть сообщение
Ну, во-первых, внаружу (к WiFi и т.д.) вы подключаетесь из выньды, через другой сетевой интерфейс, и с IP из другой подсети.
Цитата Сообщение от Axel92 Посмотреть сообщение
Тут 2 ethernet адаптера один VMnet1 с айпи 192.168.136.1, другой VMnet8 с айпи 192.168.160.1. Как узнать который из них мой?
Axel92, Вам бы почитать про маршрутизацию.
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
11.06.2017, 11:36 12
Цитата Сообщение от Axel92 Посмотреть сообщение
И последний вопрос, ввожу в cmd (уже на выньде) ipconfig выдает мне следующее зрелище(приложенный рисунок). Огромная куча айпи, как мне узнать какое из них мое айпи?
Тот, который по подсетке (по маске) совпадает с вашим IP виртуальной машины.
Как я и предполагал, это 192.168.160.1
Сделайте на него из терминала Linux:
Код
$ ping 192.168.160.1
Добавлено через 1 минуту
Цитата Сообщение от Axel92 Посмотреть сообщение
И почему когда я ищу свой айпи по гуглу сайты выдают мне вот такое вот:
Потому что эта ваш "внешний" IP внаружу, в Интернет, который вам выдаёт ваш провайдер.
0
0 / 0 / 1
Регистрация: 28.08.2016
Сообщений: 25
12.06.2017, 06:50  [ТС] 13
Уважаемый Олеж,

Вчера весь день читал про сети, точнее про айпи, LANы, WANы.

То что я понял касаемо "внешнего" и "внутреннего" IP я постараюсь описать. Если где то буду неправ пожалуйста поправьте.

Допустим мне домой нужно подключить интернет. Для этого вызываю инет провайдера, он устанавливает роутер и приписывает ему айпи, который и является "внешним". В свою очередь роутер создает локальную сеть всех девайсов которые через него выходят в инет и прописывает каждому айпи, который в свою очередь является "внутренним".
То есть непосредственный обмен пакетами с веб сервером, скажем с вк, осуществляет сам роутер через внешний айпи и потом уже сам отправляет на локальный айпи нужного девайса? Я правильно все понял?

Cпасибо!
0
322 / 170 / 24
Регистрация: 25.03.2012
Сообщений: 712
12.06.2017, 22:24 14
Цитата Сообщение от Axel92 Посмотреть сообщение
Я правильно все понял?
Я, наверное, не давал вам ссылку: Сетевое программирование в Linux.
Там становится понятно как сетевые пакеты проходят и сквозь уровень прикладных приложений + как они обрабатываются в ядре Linux.

P.S. Я не могу вам в деталях рассказывать здесь как работает сеть TCP/IP ... у людей на понимание этого и год уходит и более...
Читайте книгу Р.Стивенса "TCP/IP в подлиннике".
0
12.06.2017, 22:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.06.2017, 22:24
Помогаю со студенческими работами здесь

Приём-передача файлов по Сокетам
В локальный чат с клиентским и серверным приложениями необходимо добавить функцию,обеспечивающую...

Передача аудио-стрима по сокетам
Доброго времени суток, есть проблема в написании передачи и приема стрима Должно работать так:...

[MFC] Передача текста в MDI окно, чтение текста из окна
Для редактирования бинарного файла, содержащего разные данные, к примеру, серийный номер...

Передача текста в textEdit текста из функции
И вновь требуется помощь товарищи, дело обстоит так. Пытаюсь разобраться как передать текст в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru