Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];

Вниз

Sockets & TServiceApplication   Найти похожие ветки 

 
Lusha   (2003-01-31 17:30) [0]

Здравствуйте, господа!

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

Подскажите, пожалуйста, в каком направлении "копать" для разрешения этой проблемки...

Заранее благодарен


 
Digitman   (2003-01-31 17:33) [1]

код-то, приводящий к искл.ситуации, приведи на всяк.случай)


 
Lusha   (2003-01-31 17:44) [2]

Сие проблематично... Код, немножко, на Си...
Ну, да ладно... Есть вот такой класс...

class connector {
public:
enum dirtype_t {in, out};
connector() : soc(INVALID_SOCKET) {}
~connector() {if (soc != INVALID_SOCKET) close();}

/** Performs connection */
void connect(const char *host, int port) {
addr.sin_family = AF_INET;

// Server address
addr.sin_addr.s_addr = inet_addr(host);
// Server port
addr.sin_port = htons(port);

// Creating socket
if ((soc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
throw connector_exception("connector: can"t create socket");

// Perform connection
if (::connect(soc, (struct sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR)
throw connector_exception("connector: can"t connect.");
}

/** Close the socket */
int close() {SOCKET tmp = soc; soc = INVALID_SOCKET; return ::closesocket(tmp);}
/** Send data */
int send(const char *buf, size_t size, int flags = 0) {
int rc = ::send(soc, buf, size, flags);
if (rc == SOCKET_ERROR || rc != (int )size)
throw connector_exception("error ocured during send operation.");
dump(buf, size, out);
return rc;
}
/** Receive data */
int recv(char *buf, size_t size = ALL_AVAILABLE, int flags = 0) {
int rc;
// Receive all data in channel
if (size == ALL_AVAILABLE) {
rc = ::recv(soc, buf, RECV_BUFSIZ, flags);
if (rc != SOCKET_ERROR)
{
dump(buf, rc, in);
return rc;
}
else throw connector_exception("error ocured during receive operation.");
}
else { // Receive fixed length chunk
size_t received(size);
while (received) { // Note that there is potentially unsafe operation.
// It might "hung" when no appropriate length data
// occured in channel.
rc = ::recv(soc, buf, received, flags);
if (rc && rc != SOCKET_ERROR) // 0 means that connection has been closed
// "gracefully"
received -= rc;
else
throw connector_exception("error occured during receive operation.");
}
dump(buf - size, size, in);
return size;
}
}

// get SOCKET
const SOCKET& operator ()() {return soc;}
void set_dump(const char *name) {dmp.open(name, ios::app);}
private:
ofstream dmp;
SOCKET soc;
struct sockaddr_in addr;
void dump(const char *buf, const size_t len, const connector::dirtype_t dir = out) {
if (!dmp) return;
dmp << ((dir == out) ? "> " : "< ");
for (int i = 0; i < (int)len; ++i)
dmp << hex << setw(2) << setfill("0") << (static_cast<unsigned short>(buf[i]) & 0xff) << " " << flush;
dmp << endl; }
};

После инициализации WSAStartup(MAKEWORD(1,1), &WSAData);
Вызов функции connect приводит к генерации исключительной ситуации, см. выше... "error ocured during receive operation."





 
Digitman   (2003-01-31 17:50) [3]

а это как может быть такое ?
ИС с таким сообщением ты выбрасываешь только при recv(), а при connect() - иной же текст, как я вижу из кода !



 
Lusha   (2003-01-31 18:06) [4]

Сорри, не оттуда строчку скопировал... Генерируется "Can"t connect to"... "error ocured during receive operation" - это следствие... =)

Мне интересно, есть ли какие нибудь ограничения на использование socket в TServiceApplication... Она прост наотрез отказывается коннектиться и все тут... =(


 
Lusha   (2003-01-31 19:11) [5]

Вопрос снят... Спасибо за содействие... =)



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.007 c
3-63931
OlegM
2003-03-03 14:26
2003.03.20
Почему не работает прога с таблицами созданными на Sql


1-64191
KpeHgeJIb
2003-03-08 01:39
2003.03.20
Вопрос по TListView...


14-64365
Novic
2003-03-05 10:06
2003.03.20
Сохранение проекта


3-63949
Ditrix
2003-03-03 18:08
2003.03.20
в runtime изменить PATH в BDE альясе...


7-64412
Song
2003-01-25 17:23
2003.03.20
Как прочитать текстовый файл быстрей чем Reset() .. ReadLn() ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский