powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
10 сообщений из 10, страница 1 из 1
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34258728
warlocklex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34258775
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторint* fd2=(int*)_fd;
int fd=(int)fd2;цэ шо?
...
Рейтинг: 0 / 0
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34258829
warlocklex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34258935
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
warlocklex
Код: plaintext
1.
2.
3.
4.
    int sockfd, fd;

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



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

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

Код: 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
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34259296
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С той половиной цикла, что ты привел, вроде все нормально. Единственное замечение - я никогда не додумывался работать с сокетами read/write. Почему не используется recv/send?
...
Рейтинг: 0 / 0
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34259864
warlocklex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
UNIX-сервер,Win-клиент.клиент не отсылает серверу или сервер не принимает от клиента
    #34260063
A. Fig Lee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
warlocklex
while(!finished) {
finished = read(fd, &c, 1) != 1;

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



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

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

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


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