Передача текста по сокетам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Передача текста по сокетам»

textual
Листинг программы
#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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы для работы с сокетами
  2. Объявляются переменные:
    • sockfd - дескриптор сокета
    • n - счётчик прочитанных байт
    • recvBuff - буфер для приёма данных
    • serv_addr - адрес сервера
  3. Буфер recvBuff очищается символом '0'
  4. Создается сокет (socket) с использованием параметров:
    • AF_INET - адресный семейство интернет
    • SOCK_STREAM - тип сокета (потоковый)
    • 0 - тип сокета (используются значения по умолчанию) Если создание сокета не удалось, выводится сообщение об ошибке и возвращается 1
  5. Адресация сервера:
    • serv_addr.sin_family = AF_INET - присваивается семейство адресов
    • serv_addr.sin_port = htons(5000) - присваивается номер порта
    • serv_addr.sin_addr.s_addr = inet_addr(127.0.0.1) - присваивается IP-адрес Если подключение к серверу не удалось, выводится сообщение об ошибке и возвращается 1
  6. Устанавливается соединение с сервером с использованием дескриптора сокета и адреса сервера
  7. В цикле while считываются данные с сервера в буфер recvBuff
    • Если при чтении возникла ошибка, выводится сообщение об ошибке и возвращается 1
    • Данные выводятся на экран с помощью функции fputs
    • Очищается символ конца строки в буфере (recvBuff[n] = 0)
  8. Если чтение данных не удалось (n < 0), выводится сообщение об ошибке
  9. Закрытие сокета не предусмотрено в данном коде

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.867 из 5
Похожие ответы