Передача текста по сокетам - 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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы для работы с сокетами
- Объявляются переменные:
- sockfd - дескриптор сокета
- n - счётчик прочитанных байт
- recvBuff - буфер для приёма данных
- serv_addr - адрес сервера
- Буфер recvBuff очищается символом '0'
- Создается сокет (socket) с использованием параметров:
- AF_INET - адресный семейство интернет
- SOCK_STREAM - тип сокета (потоковый)
- 0 - тип сокета (используются значения по умолчанию) Если создание сокета не удалось, выводится сообщение об ошибке и возвращается 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
) - присваивается IP-адрес Если подключение к серверу не удалось, выводится сообщение об ошибке и возвращается 1
- Устанавливается соединение с сервером с использованием дескриптора сокета и адреса сервера
- В цикле while считываются данные с сервера в буфер recvBuff
- Если при чтении возникла ошибка, выводится сообщение об ошибке и возвращается 1
- Данные выводятся на экран с помощью функции fputs
- Очищается символ конца строки в буфере (recvBuff[n] = 0)
- Если чтение данных не удалось (n < 0), выводится сообщение об ошибке
- Закрытие сокета не предусмотрено в данном коде
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д