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

كيف يتم تحديد Local Port و Local IP في حالة وجد اكثر من شبكة

بدأه HaTy في 2 نوفمبر 2008 · 4 رد · 968 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه

طلب اخر لو سمحت

كيف يتم تحديد Local

Port و Local IP في حالة وجد اكثر من شبكة

كذلك استخدام ال Proxy ففي الفيجول بيسك مع الكومبننت توجد هذه الخاصية

فلو في مثال ارجو ارفاقه

ولك مني جزيل الشكر مسبقا

ومرفق سورس برنامج متميز لمراقبة و عمل logging للبيانات المرسلة عبر البورت

تحياتي

sniffer_src.zip

تم تعديل هذه المشاركة بواسطة time1 في 3 نوفمبر 2008 في 01:02

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#2

تفضل اخي هذا الكود لتحديد الـ Ip في حال اكثر من شبكة

#include <iostream.h>
#include <winsock.h>

int doit(int, char**)
{
	char ac[80];
	if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) {
		cerr << "Error " << WSAGetLastError() << 
				" when getting local host name." << endl;
		return 1;
	}
	cout << "Host name is " << ac << "." << endl;

	struct hostent* phe = gethostbyname(ac);
	if (phe == 0) {
		cerr << "Yow!  Bad host lookup." << endl;
		return 1;
	}

	for (int i = 0; phe->h_addr_list != 0; ++i) {
		struct in_addr addr;
		memcpy(&addr, phe->h_addr_list, sizeof(struct in_addr));
		cout << "Address " << i << ": " << inet_ntoa(addr) << endl;
	}

	return 0;
}


int main(int argc, char* argv[])
{
	WSAData wsaData;
	if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
		return 255;
	}

	int retval = doit(argc, argv);

	WSACleanup();
	return retval;
}

طبعا لاتنسى تضمين wsock32.lib إلى مشروعك .

تم تعديل هذه المشاركة بواسطة time1 في 3 نوفمبر 2008 في 01:17

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#3

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه

شكرا اخي العزيز time1 على جهودك ومساعدتك

والمثال الذي ارفقته يعطي IPs الشبكات على الجهاز

غير اني لم استطع تحويره لارسال بيانات عبر البورت

ما اوده فعلا ارسال قيمة هكس 0XA1 , 0XA2 ,0XA3 , 0XA4

عبر البورت المحلي lOCAL PORT 5555

لسيرفر عنوانه haty.mysite.com على البورت البعيد Remote Port 6666

اجوا منك تعديل المثال - مع العلم ان البورتات من النوع UDP

فقد حاولت تصميمه بالفيجول بيسك ويتم الاتصال و يستقبل من السيرفر

لكن يوجد خطا ما باعطاء بايتات زيادة بين كل رد من السيرفر

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

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

ولك جزيل الشكر مسبقا

تحياتي

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";
#4

تحديد الـ Ips لايفيدك في الـclients , يفيدك في الـ Server , لكن طالما انك كنت ترغب في تحديد ومعرفة الIps في حال وجود اكثر من شبكة بالجهاز , فالكود السابق يظهر لك الـ Ips في حال وجود اكثر من شبكة على نفس الجهاز .

اما النقطة الثانية عن كيفية ارسال بيانات للسيرفر , يمكنك استخدام الدالة sendto , مثلا :

	sendto( hSocket, buffer, sizeof( buffer ) + 1, 0, reinterpret_cast<sockaddr *>( &serverAddr ), sizeof( serverAddr ) );

وهذا مثال :

#include <winsock.h>
#pragma comment( lib,"ws2_32.lib" )

int main()
{
	// Initiate use of the WinSock DLL.

	WSADATA wsaData = { 0 };
	WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

	// Create a socket and store the handle to it.
	SOCKET hSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

	// Set the protocol, port, and address information of the server.
	sockaddr_in serverAddr = { 0 };
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons( 2345 );
	serverAddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );

	// Send a message to the server
	char buffer[] = "hello";
	sendto( hSocket, buffer, sizeof( buffer ) + 1, 0, reinterpret_cast<sockaddr *>( &serverAddr ), sizeof( serverAddr ) );

	// Cleanup.
	WSACleanup();

	return 0;
}

طبعا عنوان 127.0.0.1 عنوان الجهاز نفسه , والسلوك يعتمد على نوعيه السيرفر المصمم , مثلا تستطيع تصميم سيرفر يقوم بطباعة الData المستقبلة ,

#include <iostream>
#include <winsock.h>
#pragma comment( lib,"ws2_32.lib" )

int main()
{
	// Initiate use of the WinSock DLL.
	WSADATA wsaData = { 0 };
	WSAStartup( MAKEWORD( 2, 2 ), &wsaData );

	// Create a socket and store the handle to it.
	SOCKET hSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );

	// Set the protocol, port, and address information.
	sockaddr_in serverAddr = { 0 };
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_port = htons( 2345 );
	serverAddr.sin_addr.s_addr = INADDR_ANY;

	// Bind the socket.
	bind( hSocket, reinterpret_cast<sockaddr *>( &serverAddr ), sizeof( serverAddr ) );

	// Receive a message into the buffer.
	char buffer[1024] = { 0 };
	recvfrom( hSocket, buffer, sizeof( buffer ), 0, 0, 0 );

	// Print the message in the buffer.
	std::cout << buffer << std::endl;

	// Cleanup.
	closesocket( hSocket );
	WSACleanup();

	return 0;
}

عدل بالاكواد السابقة لتكوين الكود الذي ترغب به من خلالها وان شاء الله تحقق مرادك .

تمنياتي لك بالتوفيق .

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

#5

بســم الله الـرحمــن الرحيــم

السلام عليكــم ورحمـة الله وبركاتــه

شكرا اخي العزيز time1 على جهودك ومساعدتك

للاسف لم استطع تنفيذ ذلك

فمن شروط قبول الاتصال والرد من السيرفر يجب ان يكون

lOCAL PORT= 5555

Remote Port = 1010

وان يكون الاتصال من البروكسي المحدد مسبقا في الكمبيوتر البعيد

ولعل المثال المرفق اقرب ما و جدت لما اريده,وان لم يكن هو المطلوب تماما , فبالفعل يقوم ببدء

الاتصال بنفس اسلوب البرنامج الاصلي الذي اريد محاكاته

ولكن يوجد شيء واحد خاطيء وهو انه لا يقوم بالاتصال على البورت الذي

حددته 5555 , بل يقوم باختيار بورت عشوائي

proxy port

ارجو منك الاطلاع على المرفق

و محاولة معرفة الخطأ لانه و الله لم استطع ذلك برغم المحاولات الكثيرة

كما يرجى منك اضافة زر للبرنامج و عند النقر عليه يقوم بارسال قيمة هكس

int HexBuffer[3];

HexBuffer[0]=12;

HexBuffer[1]=244;

HexBuffer[2]=22;

HexBuffer[3]=124;

ارجوا منك تعديل المثال -

واعتذر على اتعابك معنا

ولك جزيل الشكر مسبقا

تحياتي

CAsyncSocketEx_demo.rar

while( "اسلام" )
{
 cout >> "الموت لبني صهيون" >> endl;
}
return "فلسطين";

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