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) связь с сервером есть.
помогите! направте мысль в нужное русло.
while(!finished) {
finished = read(fd, &c, 1) != 1;
if(c == '\n') break; else
if(c != '\r') cmd += c;
}
что происходит?
fd - сокет? на таймауте?, без блокировки? если нет, то просто висим?
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]
и дальше то что для сервера ранее я писал.
Может дело в кодировках сообщений, хотя вроде все на аглицком. Попробуй залогонить и посмотреть что за символы принимает сервер
вот тот цикл коментарить не стоит конечно, похоже это основной цикл работы демона. а добавить туда что нить типа
syslog(LOG_NOTICE,"get char=%c",c);
сразу после приема сивола - finished = read(fd, &c, 1) != 1;
Да, а что логи то показывают, на чем все останавливается то? Как определяете отказ?