Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента

12K
16 января 2007 года
warlocklex
15 / / 14.01.2006
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента

такая вот проблема. а с win-server'ом всё работает.

кусок сервера который обрабатывает прием и посылку

int* fd2=(int*)_fd;
int fd=(int)fd2;
char c;
bool finished;
string cmd, answer, stmp="", Login, Passwd, answer2="";
char* tmp;
int IDtmp=0,itmp=0,UserNum=0,i;

syslog(LOG_NOTICE,"SocketConnected=%d",fd);
finished = false;

answer = "the simple tcp daemon is ready";
write(fd, answer.c_str(), answer.size());//- это клиент получает

while(!finished) {
cmd = answer = "";

/* Read a line from the client side*/

while(!finished) {
finished = read(fd, &c, 1) != 1;

if(c == '\n') break; else
if(c != '\r') cmd += c;
}

/* If there is a command and no socket error appeared in the previous cycle, try to perform some processing.*/

if(!finished && !cmd.empty()) {
syslog(LOG_NOTICE,"cmd=%s from Socket: %d",cmd.c_str(),fd);
if(cmd == "hello") {
answer = "my daemonic greatings";
} else if(cmd == "version") {
answer = "Verision 0.0001 = Alpha. Mega-Message-Server";
} else if(cmd == "quit") {
shutdown(fd, 2);
close(fd);
finished = true;
}


этот клиент на С++Builder ClientSocket принимал приветсвие от сервера


void __fastcall TChat::B_SendClick(TObject *Sender)
{
AnsiString str =say->Text;

ClientSocket1->Socket->SendText(str);

}
//---------------------------------------------------------------------------

void __fastcall TChat::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
Pole->Lines->Add(Socket->ReceiveText());
}
//---------------------------------------------------------------------------


другой клиент написан на элементарных(другое название WinApi-socket) сокетах.Таже история.


void __fastcall TForm_client::Button_connctClick(TObject *Sender)
{
// создание элементарного сокета
sockfd =socket(AF_INET, SOCK_STREAM, 0);
if(!sockfd)
{ ShowMessage("error_socket create");
return;}

memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = inet_addr(Edit_ipadr->Text.c_str());
sa.sin_port = htons(55555);

if (0!=connect(sockfd, (struct sockaddr *) &sa, sizeof(sa)))
{ // ShowMessage(GetLastError()); ShowMessage("connect_error");
StatusBar1->SimpleText="Connect_error";
return; }
}
//---------------------------------------------------------------------------
void __fastcall TForm_client::Button_sendClick(TObject *Sender)
{
// послать
sendbuf=Edit_send->Text.c_str();
send(sockfd,sendbuf,strlen(sendbuf),0);
//принять
int bytesRecv = 0;
while( bytesRecv == 0 ) {
bytesRecv = recv( sockfd, recvbuf, sizeof(recvbuf), 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
StatusBar1->SimpleText="Connection Closed";
return;
}
if (bytesRecv < 0)
return;
StatusBar1->SimpleText=("Bytes Recv: "+bytesRecv);
Memo1->Lines->Add(recvbuf);
}

}
//---------------------------------------------------------------------------


в телнете(win и unix) связь с сервером есть.
помогите! направте мысль в нужное русло.
361
16 января 2007 года
Odissey_
661 / / 19.09.2006
В этом месте -
while(!finished) {
finished = read(fd, &c, 1) != 1;

if(c == '\n') break; else
if(c != '\r') cmd += c;
}

что происходит?
fd - сокет? на таймауте?, без блокировки? если нет, то просто висим?
12K
16 января 2007 года
warlocklex
15 / / 14.01.2006
Цитата: Odissey_
В этом месте -
while(!finished) {
finished = read(fd, &c, 1) != 1;

if(c == '\n') break; else
if(c != '\r') cmd += c;
}

что происходит?
fd - сокет? на таймауте?, без блокировки? если нет, то просто висим?


сам не в курсе исходник такой дали.Сам понимаешь тут читает из сокета 1й символ.Зачем? не знаю. удалю попробую без него.


void mainloop() {
int sockfd, fd;
struct sockaddr_in sa;
socklen_t n;

sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(sockfd != -1) {
memset(&sa, 0, sizeof(sa));

sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_ANY);
sa.sin_port = htons(55555);

if(bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) != -1) {
while(1) {
if(!listen(sockfd, SOMAXCONN)) {
n = sizeof(sa);
if((fd = accept(sockfd, (struct sockaddr *) &sa, &n)) != -1) {
syslog(LOG_NOTICE, "connection from %s", inet_ntoa(sa.sin_addr));
{
pthread_t thread;
pthread_create(&thread, NULL, operate, (void*)fd);
pthread_detach(thread);
}
}
}
}
}
}
} …
void *operate(void *_fd) {
[\b]
и дальше то что для сервера ранее я писал.

361
17 января 2007 года
Odissey_
661 / / 19.09.2006
Беглый анализ кода ничего не дал. Вроде все нормально.
Может дело в кодировках сообщений, хотя вроде все на аглицком. Попробуй залогонить и посмотреть что за символы принимает сервер
вот тот цикл коментарить не стоит конечно, похоже это основной цикл работы демона. а добавить туда что нить типа
syslog(LOG_NOTICE,"get char=%c",c);
сразу после приема сивола - finished = read(fd, &c, 1) != 1;
Да, а что логи то показывают, на чем все останавливается то? Как определяете отказ?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог