Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2010, 15:46   #1
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию непонятки по поводу irc

1. Из сокета читаются какие-то куски сообщений, а не сообщения целиком (как будто сообщения приходят порциями по несколько символов) (проверялось выводом на экран какого-нибудь символа после каждого прочтения).
2. Сервер игнорирует команду присоединения на канал JOIN #chanelname хотя, если сидеть в ирке через telnet, команда принимается.


Код:
/************************************************/
/*   main.cpp - за основу взят пример Олега Куткова. */
/************************************************/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

//------
#include "client.cpp"

extern int errno; 	//глобальная переменная, которая хранит код последней ошибки

//функция подключения к серверу. объявление
//аргументы:
//host - адрес (имя) сервера
//port - порт сервера
//transport - протокол tcp или udp
int connectsock(const char *host, const char *port, const char *transport);

//главная функция
int main(int argc, char **argv)
{
	int sock; 	//сокет
	char msg[512];	//буфер сообщения

	if(argc == 3) 	//проверяем количество переданных аргументов.
	{
		//подключаем сокет, в качестве хоста - первый аргумент программы, в качестве порта - второй аргумент программы
		//напомню, что в argv[0] хранится имя самого исполняемого файла программы, поэтому его опускаем.
		sock = connectsock(argv[1], argv[2], "tcp");
		if(sock < 0)	//проверяем дескриптор сокета
			return -1;

//Начало интересного(то, что я менял в "основе")


		else 		//подключились
			{
				printf("Установлено соединение с %s:%s\n", argv[1], argv[2]);
                strcpy(msg, "NICK RODOT\n USER none \"\" \"localhost\" :nonev\r\n\0");		//подготавливаем строку сообщения
                cout<<">>>"<<msg;
                if(write(sock, msg, sizeof(msg)) < 0)		//отсылаем серверу
					{
						printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
						return -1;
					}
                memset(&msg, 0, sizeof(msg));

               strcpy(msg, "join #programmersforum\n\0");		//подготавливаем строку сообщения
                cout<<">>>"<<msg;
                if(write(sock, msg, sizeof(msg)) < 0)		//отсылаем серверу
					{
						printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
						return -1;
					}
				memset(&msg, 0, sizeof(msg));
				while(true)
				{
                    reception(sock, &msg[0],sizeof(msg));
				}

//конец интересного



				/*
				strcpy(msg, "hello\0");		//подготавливаем строку сообщения
				if(write(sock, msg, sizeof(msg)) < 0)		//отсылаем серверу
					{
						printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
						return -1;
					}
				printf("Серверу отправлен \"hello\"\n");	//читаем ответ сервера
				memset(&msg, 0, sizeof(msg));
				if(read(sock, msg, sizeof(msg)) < 0)
					{
						printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
						return -1;
					}
				else				//выводим ответ сервера
					printf("От сервера получено: %s\n", msg);
			close(sock);	//закрываем сокет*/
			}

	} else	//иначе
		printf("Использование: server \"server\" \"port\"\n");	//выводим подсказку по использованию.
	return 0;
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 12.08.2010 в 15:49.
ROD вне форума Ответить с цитированием
Старый 12.08.2010, 15:47   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

продолжение
Код:
//функция подключения к серверу. реализация
int connectsock(const char *host, const char *port, const char *transport)
{
	struct hostent *phe; //указатель на запись с информацией о хосте
	struct servent *pse; //указатель на запись с информацией о службе
	struct protoent *ppe; //указатель на запись с информацией о протоколе
	struct sockaddr_in sin; //структура IP-адреса оконечной точки
	int s, type; //дескриптор сокета и тип сокета

	//обнуляем структуру адреса
	memset(&sin, 0, sizeof(sin));
	//указываем тип адреса (IPv4)
	sin.sin_family = AF_INET;
	//задаем порт
	sin.sin_port = htons((unsigned short)atoi(port));
	//преобразовываем имя хоста в IP-адрес, предусмотрев возможность представить его
	//в точечном десятичном формате
	if(phe = gethostbyname(host))
		memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
	//преобразовываем имя транспортного протокола в номер протокола
	if((ppe = getprotobyname(transport)) == 0)
		{
			printf("Ошибка преобразования имени транспортного протокола: %s\n", strerror(errno));	//в случае неудачи выводим сообщение ошибки
			return -1;
		}
	//используем имя протокола для определения типа сокета
	if(strcmp(transport, "udp") == 0)
		type = SOCK_DGRAM;
	else
		type = SOCK_STREAM;
	//создание сокета
	s = socket(PF_INET, type, ppe->p_proto);
	if(s < 0)
		{
			printf("Ошибка создания сокета: %s\n", strerror(errno));	//в случае неудачи выводим сообщение ошибки
			return -1;
		}
	//попытка подключить сокет
	if(connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
		{
			printf("Не удалось подключится к серверу: %s\n", strerror(errno));	//в случае неудачи выводим сообщение ошибки
			return -1;
		}
	//возвращаем дескриптор подключенного сокета
	return s;
}
Код:
/************************************************/
/*   client.cpp - тут, предпологалось, разместить все,  */
/*       что связано с отправкой сообщений               */
/************************************************/
using namespace std;


int reception(int sock, char *msg, int size);//прием
int transmission(int sock, char *msg, int size);//передача



int reception(int sock, char *msg, int size)
{
    if(read(sock, msg, sizeof(msg)) < 0)
        {
            printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
            return -1;
        }
        else				//выводим ответ сервера
        {
            //printf("От сервера получено: %s\n", msg);
            cout<<msg;
            if(strstr(msg, "PING"))
            {
                //strcpy(msg, "PONG\n\0");		//подготавливаем строку сообщения
                msg[0]='P';
                msg[1]='O';
                msg[2]='N';
                msg[3]='G';
                transmission(sock, &msg[0],sizeof(msg));
            }
           /* if(strstr(msg, "")
            {
                strcpy(msg, "JOIN #programmersforum\r\n\0");		//подготавливаем строку сообщения
                cout<<">>>"<<msg;
                transmission(sock, &msg[0],sizeof(msg));
            }*/
            memset(&msg, 0, sizeof(msg));
        }
return 0;
}

int transmission(int sock, char *msg, int size)
{
    //strcpy(msg, "NICK RODOT\n USER none \"\" \"localhost\" :nonev\n\0");		//подготавливаем строку сообщения
    cout<<">>>"<<msg;
    if(write(sock, msg, sizeof(msg)) < 0)		//отсылаем серверу
    {
        printf("Не удалось отправить данные серверу: %s\n", strerror(errno));
        return -1;
    }
    memset(&msg, 0, sizeof(msg));
    return 0;
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IRC server Razyiller Работа с сетью в Delphi 1 03.12.2010 17:50
IRC firefox0013 Общие вопросы .NET 0 16.04.2010 05:33
Непонятки с кнопками Devoto Общие вопросы Delphi 2 16.11.2008 20:47
qip + irc Спартак Софт 0 19.07.2008 21:44
IRC в Indy Zer0 Работа с сетью в Delphi 2 12.02.2008 09:57