كيف أصنع الوكيل من الخادم والعميل؟
السلام عليكم...
لدي برنامجان مكتوبان بلغة السي أحدهما Server والآخر Client وهما يعملان مع بعضهما بشكل جيد.
يستخدمان بروتوكول UDP
في صفحة Terminal في Linux أقوم بكتابة الأمر التالي في شاشة:
والأمر التالي في شاشة أخرى
كود:
./Client 127.0.0.1 8000
فيقوم العميل بإرسال 100 حزمة إلى الخادم على المنفذ 8000 ويستقبلها الخادم من المنفذ ذاته.
ما أريد أن أعمله هو كتابة برنامج يكون وسيطا (وكيلا) (Proxy) بين الاثنين ...
بحيث يستقبل الحزم من العميل ويرسلها إلى الخادم.
أعلم أنه سيكون برنامجا يجمع الاثنين، وقد فعلت ذلك، لكن المشكلة أن المعطيات Parameters التي تعطى له يجب أن تكون 3 معطيات :
1 ) رقم المنفذ الذي يرسل منه العميل، وهو ذاته الذي يستقبل منه الوكيل.
2) رقم المنفذ الذي يستقبل منه الخادم ، وهو ذاته الذي يرسل منه الوكيل.
3 ) عنوان IP الخاص بالخادم.
كيف سأكتب أمر الوكيل بهذه المعطيات الثلاثة ، وماهي التعديلات التي ينبغي أن أعدلها عليه حتى يعمل بشكل جيد.
الخادم والعميل ومحاولتي لكتابة الوكيل في الردود أدناه.
أرجو أن أجد لديكم إجابة شافية ، فأنا أحتاج لعمل وكيل آخر أيضا ببروتوكول ICMP بعد البحث عن خادم وعميل يستخدمان ICMP.
ملاحظة : أنا أعمل على شبكة افتراضية يقدمها موقع www.planet-lab.org ولي صلاحية تنفيذ الأكواد على عدد من الأجهزة حول العالم.
رد: كيف أصنع الوكيل من الخادم والعميل؟
هذا كود العميل
كود:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include "clientserver.h"
#define BUFLEN 512
int main(int argc, char **argv)
{
struct sockaddr_in si_server;
int port, s, i, slen=sizeof(si_server);
char buf[BUFLEN];
char srv_addr[16];
memset(srv_addr, 0, 16);
if(argc<3)
{
fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
exit(EXIT_FAILURE);
}
port=atoi(argv[2]);
printf("port = %d\n", port);
if(port<1024)
{
fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
fprintf(stderr, "\twhere <port number> shall be > 1023\n");
exit(EXIT_FAILURE);
}
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memcpy(srv_addr, argv[1], strlen(argv[1]));
memset((char *) &si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(port);
if (inet_aton(srv_addr, &si_server.sin_addr)==0)
{
fprintf(stderr, "inet_aton() failed\n");
exit(EXIT_FAILURE);
}
if(argc==4)
{
sprintf(buf, "%s", argv[3]);
if (sendto(s, buf, strlen(argv[3]), 0, (struct sockaddr *)&si_server, slen)==-1)
{
perror("sendto()");
exit(EXIT_FAILURE);
}
}
else
{
for (i=0; i<100; i++)
{
printf("Sending packet %d\n", i);
sprintf(buf, "This is packet %d\n", i);
if (sendto(s, buf, BUFLEN, 0, (struct sockaddr *)&si_server, slen)==-1)
{
perror("sendto()");
exit(EXIT_FAILURE);
}
}
}
close(s);
exit (EXIT_SUCCESS);
}
رد: كيف أصنع الوكيل من الخادم والعميل؟
هذه محاولتي لكتابة كود الوكيل:
كود:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include "clientserver.h"
int w =0;
#define BUFLEN 512
int main(int argc, char **argv)
{
struct sockaddr_in si_local, si_remote;
int s;
int port;
unsigned int slen;
char buf[BUFLEN];
if(w==0)//stupid line
{//stupid line
slen = sizeof(si_remote);
if(argc!=2)
{
fprintf(stderr, "Usage: %s <port number>\n", argv[0]);
exit(EXIT_FAILURE);
}
port=atoi(argv[1]);
if(port<1024)
{
fprintf(stderr, "Usage: %s <port number>\n", argv[0]);
fprintf(stderr, "\twhere <port number> shall be > 1023\n");
exit(EXIT_FAILURE);
}
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memset((char *) &si_local, 0, sizeof(si_local));
si_local.sin_family = AF_INET;
si_local.sin_port = htons(port);
si_local.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(s, (const struct sockaddr *)&si_local, sizeof(si_local))==-1)
{
perror("bind");
exit(EXIT_FAILURE);
}
int long q= 100;
while(q>0)
{
q--;
memset(buf, 0, sizeof(char)*BUFLEN);
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *)&si_remote, &slen)==-1)
{
perror("recvfrom()");
exit(EXIT_FAILURE);
}
if(strstr(buf, ".quit.")!=NULL)
{
printf("\".quit.\" Received \n");
printf("Exiting\n");
break;
}
else
{
printf("Received packet from %s:%d\n", inet_ntoa(si_remote.sin_addr),
ntohs(si_remote.sin_port));
printf("Data: %s\n", buf);
}
}
w++;//stupid line
// Here some code have to added.
}//stupid line
//*********************************************Client************************************
printf("Hello Client Part\n");
struct sockaddr_in si_server;
// int port, s, i, slen=sizeof(si_server);
// char buf[BUFLEN];
char srv_addr[16];
memset(srv_addr, 0, 16);
if(argc<3)
{
fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
exit(EXIT_FAILURE);
}
port=atoi(argv[2]);
printf("port = %d\n", port);
if(port<1024)
{
fprintf(stderr, "Usage: %s <destination IP address> <port number>\n", argv[0]);
fprintf(stderr, "\twhere <port number> shall be > 1023\n");
exit(EXIT_FAILURE);
}
if ((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memcpy(srv_addr, argv[1], strlen(argv[1]));
memset((char *) &si_server, 0, sizeof(si_server));
si_server.sin_family = AF_INET;
si_server.sin_port = htons(port);
if (inet_aton(srv_addr, &si_server.sin_addr)==0)
{
fprintf(stderr, "inet_aton() failed\n");
exit(EXIT_FAILURE);
}
if(argc==4)
{
sprintf(buf, "%s", argv[3]);
if (sendto(s, buf, strlen(argv[3]), 0, (struct sockaddr *)&si_server, slen)==-1)
{
perror("sendto()");
exit(EXIT_FAILURE);
}
}
else
{
int x;
for (x=0; x<100; x++)
{
printf("Sending packet %d\n", x);
sprintf(buf, "This is packet %d\n", x);
if (sendto(s, buf, BUFLEN, 0, (struct sockaddr *)&si_server, slen)==-1)
{
perror("sendto()");
exit(EXIT_FAILURE);
}
}
}
close(s);
exit (EXIT_SUCCESS);
w=0;//stupid line
return 0;
}