Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента / 10 сообщений из 10, страница 1 из 1
16.01.2007, 13:59
    #34258728
warlocklex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
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) связь с сервером есть.
помогите! направте мысль в нужное русло.
...
Рейтинг: 0 / 0
16.01.2007, 14:12
    #34258775
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
авторint* fd2=(int*)_fd;
int fd=(int)fd2;цэ шо?
...
Рейтинг: 0 / 0
16.01.2007, 14:25
    #34258829
warlocklex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
maXmo авторint* fd2=(int*)_fd;
int fd=(int)fd2;цэ шо?

идентификатор сокета.

тот кусок что раннее описал это функция void *operate(void *_fd) { ......

а береться сокет от сель


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);
}
}
}
}
}
}
}
...
Рейтинг: 0 / 0
16.01.2007, 14:47
    #34258935
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
warlocklex
Код: plaintext
1.
2.
3.
4.
    int sockfd, fd;

                    	    pthread_create(&thread, NULL, operate, (void*)&fd);//тут и передает 



Так попробуй.
...
Рейтинг: 0 / 0
16.01.2007, 14:49
    #34258946
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
Сорри. Ошибся. Но дескриптор сокета я бы передавал по ссылке.

А коннект то происходит?
В следующий раз исходники в тек SRC помистишь?
...
Рейтинг: 0 / 0
16.01.2007, 16:13
    #34259254
warlocklex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
соединение происходить.Сервер посылает приветсвие, клиенты получают.Дальше труба: не тебе приём ,не передача.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
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) {
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;
}
...
Рейтинг: 0 / 0
16.01.2007, 16:23
    #34259296
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
С той половиной цикла, что ты привел, вроде все нормально. Единственное замечение - я никогда не додумывался работать с сокетами read/write. Почему не используется recv/send?
...
Рейтинг: 0 / 0
16.01.2007, 19:06
    #34259864
warlocklex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
AkhС той половиной цикла, что ты привел, вроде все нормально. Единственное замечение - я никогда не додумывался работать с сокетами read/write. Почему не используется recv/send?
это read/write от этого recv/send отличает наличие доп.параметра флага. ХЗ что лучше.тут так.

там у сервера такой отсыл выбраной команды\реакции.
Код: plaintext
1.
2.
3.
4.
if(!finished && !answer.empty()) {
	    //answer += "\n";
	    write(fd, answer.c_str(), answer.size());
	}
...
Рейтинг: 0 / 0
16.01.2007, 21:35
    #34260063
A. Fig Lee
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
warlocklex
while(!finished) {
finished = read(fd, &c, 1) != 1;

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



Ета, советую почитать о read в УНИХе - как работает. И вообще - пользоватся select.
...
Рейтинг: 0 / 0
17.01.2007, 10:03
    #34260629
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
warlocklex это read/write от этого recv/send отличает наличие доп.параметра флага. ХЗ что лучше.тут так.

recv хуже быть не может, по определению :).

Ну, раз обмен какой-то есть, значит, скорее всего, ошибка алгоритмическая. Советую снять логи в run-time на каждых проходах цикла. Возможно где-то "затык".
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]