الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة مع idtcpclient من indy

بدأه saada في 14 أبريل 2012 · 5 رد · 725 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تحية لكل الذين يقدمون المساعدة

انا اعمل حاليا على برنامج client / server بواسطة ديلفي 7 ومكتبة indy

والمشكلة هي عندما احول الاتصال بالمخدم ويكون النخدم مطفأ

idtcpclient1.connect ;

تظهر رسالة خطأ

كيف يمكن تجنب هذه الرسالة

وكيف يمكن فحص حالة المخدم قبل هذه التعليمة

ولكم جزيل الشكر

غالبا تأتي الأمور المناسبة في الأوقات غير المناسبة

هكذا تعمل الطبيعة

#2

الindy client يظهر بشكل افتراضى رسالة خطأ عند حدوث خطأ فى الاتصال,

يمكنك ان تضعها بين Try...Finaly و بهذه الطريقة تستطيع ان تتعامل بنفسك مع الخطأ( يمكنك مثلا ان تقوم باعادة محاولة الاتصال ).

#3

اخي الكريم

لقد جربت كل الطرق العادية الممكنة

انما الخطأ يحصل داخل تنفيذ تعليمة connect

انا كنت اسال ان كان يوجد طريقة لفحص الملقم ان كان في حالة عمل والمنفذ المطلوب جاهز ام لا

قبل تنفيذ التعليمة

غالبا تأتي الأمور المناسبة في الأوقات غير المناسبة

هكذا تعمل الطبيعة

#4

طب أخبرنى ما هى الرسالة التى تظهر؟

الindy client يقوم برمى exception فى حالة حدوث خطأ فى الاتصال, و طبعا فى حالة عدم التعامل معها يتم التقاطها بواسطة الTry Bracket الكبير الذى يحتوى برنامجك فى الVCL بشكل افتراضى و يظهرها فى MessageBox.

استخدام try سوف يجعلك تمسك بهذه الexception و تتعامل معها بدلا من الTry الاساسى و تكون هذه الرسالة "Can't connect" او شىء من هذا القبيل هل الرسالة التى تتلقاها شىء أخر؟.

#5

اخي الكريم

الرسالة هي كالتالي :

socket error #10061 coccention refused

وهي اكسبشن من داخل مكتبة الاندي في الوحدة idStack على السطر 177

طبعا انا استخدم الاندي الذي اتى مع ديلفي 7

واذا انا استخدمت اكسيبت سوف تظهر هذه الرسالة اولا ثم الرسالة التي اضعها انا في الاكسيبت

مع جزيل الشكر للاهتمام

غالبا تأتي الأمور المناسبة في الأوقات غير المناسبة

هكذا تعمل الطبيعة

#6

أنا استخدم c++ builder 2007 و عندما جربت الTry Catch لم تظهر هذه الرسالة, لكن بتحديث مكتبة اندى.

عندى حل أفضل,

لماذا لا تستخدم winsock مباشرة, كود الclient هو بضعة سطور فقط, و سوف يتيح لك التحكم فى كل شىء.

هذا كود بسيط بالسى++, أعتقد انه يمكنك تحويله بسهولة الى كود Object Pascal.

	  // Initialize Winsock.
	char adr[100];

    WSADATA wsaData;
    int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
    if ( iResult != NO_ERROR )
        printf("Error at WSAStartup()\n");

    // Create a socket.
    SOCKET m_socket;
    m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );

    if ( m_socket == INVALID_SOCKET ) {
        printf( "Error at socket(): %ld\n", WSAGetLastError() );
        WSACleanup();
        return;
    }

    // Connect to a server.
    sockaddr_in clientService;
	cout<<"\nEnter IP Adress : ";
	cin>>adr;
    clientService.sin_family = AF_INET;

    clientService.sin_addr.s_addr = inet_addr(adr);
	clientService.sin_port = htons( 80 );

    if ( connect( m_socket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
        printf( "\nFailed to connect.\n" );
        WSACleanup();
        return;
    }
	else
		cout<<"\nConnected Succefully\n";

   // Send and receive data.
    int bytesSent;
    int bytesRecv = SOCKET_ERROR;
    char sendbuf[32] = "Client: Sending data.";
    char recvbuf[100] = "";

	cout<<"\nEnter String To Send : ";
	cin>>sendbuf;
	strcat(sendbuf,"\n");
	strcat(sendbuf,"\n");

    bytesSent=send(m_socket,sendbuf,32,0);

	cout<<"\nSent!\n";
      bytesRecv=recv(m_socket,recvbuf,100,0);
		cout<<"\nString Received : "<<recvbuf<<endl;
    return;
1

مواضيع مشابهة