Форум: "Сети";
Текущий архив: 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