PDA

View Full Version : سوال درباره برنامه كلاينت سرور



zahra.mf
سه شنبه 10 آبان 1390, 22:44 عصر
سلام
من تو محيط لينوكس برنامه كلاينت سرور و به زبانc نوشتم هم كلاينت هم سرور هر دو compileميشن errorهم ندارن برنامه رو جوري نوشتم كه كلاينت درخواست ميده با يه شماره portكه سرور كوش ميده كلاينت بايد usernameوpasswordبده به سرور,سرور هم user name وpasswordوبا جيزي كه تو يه فايل ذخيره شده داره مقايسه ميكنه در صورت مساوي بودن درخواست كلاينت و اجرا ميكنه براي سرور تابعacceptونوشتم كلاينت هم تابع coonectو داره ولي ولي به هم وصل نميشن!

حامد مصافی
چهارشنبه 11 آبان 1390, 08:53 صبح
اطلاعات ارائه شده بسیار اندک هستند!

zahra.mf
چهارشنبه 11 آبان 1390, 19:06 عصر
دوباره سلام
برنامه كلاينت سرورم بايد اين طوري كار كنه كه كلاينت با شمارهportكه سرور بهش كوش ميده ازش درخواست ميكنه وبهشusernameوpasswordميده وسرور باuserوpasswordكه تو يه فايل ذخيره كرده مقايسه ميكنه اكه غلط بود به ازاي غلط بودن هر كدوم يه كد به كلاينت ميده اكه هم درست بود كه درخواستش و اجرا ميكنه كلاينت وقتي ميخاد با سرور ارتباط برقرار كنه با تابعconnectوسرور هم باacceptدرخواستش و قبول ميكنه من همه كارا رو كردم سرورم compileميشه بدون errorهم اجرا ميشه ولي كلاينت باهاشconnect نميشه اصلا نميدونم مشكل كجاست كه توضيح بدم و سوال ببرسم!!ميتونم برنامه اي كه نوشتم و براتون بفرستم كه كدش و ببينيد؟!!اكه اره ججوري بفرستم؟!

NIMA_1981
چهارشنبه 11 آبان 1390, 19:20 عصر
میشه بگی از چه مند ارتابطی بین این دوتا برنامه استفاده کردی - مثلا در بعضی از این برنامه ها باید یک کلید تعریف کنی که دوتا برنامه هم دیگه رو پیدا کنن -حالا شما اول نوع ارتباط رو بگو یا سورس برنامه رو قرار بده

zahra.mf
چهارشنبه 11 آبان 1390, 19:35 عصر
اين برنامه سرور
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

#define DIRSIZE 8192
main()
{

char dir[DIRSIZE] ; /* used for incomming dir name, and
outgoing data */
char port ,hostname,PORT[10],HOST[10],username[30],password[30],user[20],pass[20];
char Z[30],M[30];
int sd, sd_current, cc, fromlen, tolen;
int addrlen;
int port1 ;

struct sockaddr_in sin;
struct sockaddr_in pin;
FILE *p;
p=fopen("server.conf","r");
fscanf(p,"%d",&port1);




/* get an internet domain socket */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port1);
/* bind the socket to the port number */
if (bind(sd, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
perror("bind");
exit(1);
}
/* show that we are willing to listen */

if (listen(sd,5) == -1) {
perror("listen");
exit(1);
}
/* wait for a client to talk to us */
/* socklen_t addrlen = sizeof(pin); */
while(1){
if ((sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen)) == -1) {
perror("accept");
exit(1);
}

if(send(sd_current, "200" ,strlen("200"), 0) == -1){
perror("send");
exit(1);
}
/* get a message from the client */
if (recv(sd_current, dir, sizeof(dir), 0) == -1) {
perror("recv");
exit(1);
}

if(recv(sd_current,username,sizeof(username), 0) == -1){
perror("recv");
exit(1);
}

if(recv(sd_current,password,sizeof(password), 0) == -1){
perror("recv");
exit(1);
}


fscanf(p,"%s%s",&Z[30],&M[30]);
strcpy(user,Z);
strcpy(pass,M);
if(strcmp (user, username) == 0){

if( strcmp ( pass, password) == 0){

read_dir(dir);

if (send(sd_current, dir, strlen(dir), 0) == -1) {
perror("send");
exit(1);
}

}


else{

if (send(sd_current, "202", strlen("202"), 0) == -1){
perror("send");
exit(1);}
}

}





else{
if (send(sd_current, "201", strlen("201"), 0) == -1){
perror("send");
exit(1);}
}










close(sd_current); close(sd);

/* give client a chance to properly shutdown */
sleep(1);
}
}
اينم برنامه كلاينت
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

/* REPLACE with your server machine name*/
#define DIRSIZE 8192
main(argc, argv)
int argc; char **argv;
{
char hostname[100],portnumber[100],password[30],username[30],INVALIDUSER[30],INVALIDPASS[30],OK[5];
char dir[DIRSIZE];
int sd;
int port1;
struct sockaddr_in sin;
struct sockaddr_in pin;
struct hostent *hp;
printf("argc=%d\n",argc);



if (argc>2)
{
strcpy(hostname,argv[0]);
strcpy(portnumber,argv[1]);
strcpy(dir,argv[2]);
}

/* go find out about the desired host machine */
if ((hp = gethostbyname(hostname)) == 0) {
perror("gethostbyname");
exit(1);
}
/* fill in the socket structure with host information */
memset(&pin, 0, sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
pin.sin_port = htons(port1);
/* grab an Internet domain socket */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/* connect to PORT on HOST */
if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) {
perror("connect");
exit(1);
}
if(recv(sd,OK,sizeof(OK),0) == -1){
perror("recv");
exit(1);
}

if(send(sd,username,strlen(username),0) == -1){
perror("send");
}
if(send(sd,password,strlen(password),0) == -1){
perror("send");
exit(1);
}

/* send a message to the server PORT on machine HOST */
if (send(sd, argv[2], strlen(argv[2]), 0) == -1) {
perror("send");
exit(1);
}


/* wait for a message to come back from the server */
if (recv(sd, dir, DIRSIZE, 0) == -1) {
perror("recv");
exit(1);}
if(recv(sd,INVALIDUSER,sizeof(INVALIDUSER),0) == -1){
perror("recv");
exit(1);
}
if(recv(sd,INVALIDPASS,sizeof(INVALIDPASS),0) == -1){
perror("recv");
exit(1);}

/* spew-out the results and bail out of here! */
printf("%s\n", dir);
close(sd);
}

اينم برنامه readdirectory
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#define DIR_SIZE 8192
read_dir(dir)
char *dir; /* anticipate char dir[DIR_SIZE] */
{
DIR * dirp;
struct dirent *d;
/* open directory */
dirp = opendir(dir);
if (dirp == NULL)
return(0);
/* stuff filenames into dir buffer */
dir[0] = '\0';
while (d = readdir(dirp))
sprintf(dir, "%s%s\n", dir, d->d_name);
/* return the result */
closedir(dirp);
}

zahra.mf
چهارشنبه 11 آبان 1390, 20:09 عصر
كار برنامهreaddirectoriاينه كه وقتي كلاينت از سرور ميخاد كه ليشت برنامه هاي تويhomeرو براش جاب كنه سرور با استفاده از اين برنامه اين كار و انجام ميده حلقه whileكه قرار دادم برا اينه كه سرور با يه بار دريافت درخاست از كلاينت كارش تموم نشه و بازم منتظر درخاست بمونه يه جيز ديكه هم اون فايلي كه قراره سرور بره ازشuserوpasswordبخونه وبا userوpassكلاينت مقايسه كنه تو خط اولش شمارهportنوشته شده خط دومlocalhostخط سوم هم userوpassواينجوري نوشتمzahra:minaخودم حدس ميزنم منطق برنامه مشكل داره ولي جون موقع اجرا error نميكيره نميفهمم مشكل كجاست!من اين برنامه رو تو محيط لينوكس(ubunto)نوشتم و اجرا كردم

zahra.mf
شنبه 14 آبان 1390, 20:15 عصر
دوباره سلام
سوالى كه راجع به برنامه كلاينت سرور داشتم و توconnectمشكل داشتم مشكل connectحل شد و رابطه بين كلاينت و سرور برقرار شده كلاينت هم از كاربر usernameوpasswordميخاد ولي وقتيusernameوpasswordميگيره بايد هر جي تو homeلينوكس داريم جاب كنه ولي برنامه كاري نميكنه نميدونم مشكل از سرور يا كلاينت.من سورس برنامه اي كه درستش كردم و اجرا ميشه ميذارم هر كي فهميد مشكلش از كجاست يا سرور مشكل داره يا كلاينت كمكم كنه
سرور

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

#define DIRSIZE 8192
main()
{

char dir[DIRSIZE] ; /* used for incomming dir name, and
outgoing data */
char hostname,PORT[10],HOST[10],username[30],password[30],user[20],pass[20],port1[4];
char Z[30],M[30];
int sd, sd_current, cc, fromlen, tolen;
int addrlen;
int port ;

struct sockaddr_in sin;
struct sockaddr_in pin;
FILE *p;
p=fopen("server.conf","r");
fseek(p,0,SEEK_SET);
fscanf(p,"%4s",port1);

port=atoi(port1);



/* get an internet domain socket */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/* complete the socket structure */
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
/* bind the socket to the port number */
if (bind(sd, (struct sockaddr *) &sin, sizeof(sin)) == -1) {
perror("bind");
exit(1);
}
/* show that we are willing to listen */

if (listen(sd,5) == -1) {
perror("listen");
exit(1);
}
/* wait for a client to talk to us */
/* socklen_t addrlen = sizeof(pin); */
while(1){
if ((sd_current = accept(sd, (struct sockaddr *) &pin, &addrlen)) == -1) {
perror("accept");
exit(1);
}

if(send(sd_current, "200" ,strlen("200"), 0) == -1){
perror("send");
exit(1);
}
/* get a message from the client */
if(recv(sd_current,username,sizeof(username), 0) == -1){
perror("recv");
exit(1);
}

if(recv(sd_current,password,sizeof(password), 0) == -1){
perror("recv");
exit(1);
}

if (recv(sd_current, dir, sizeof(dir), 0) == -1) {
perror("recv");
exit(1);
}
fseek(p,22,SEEK_SET);
fscanf(p,"%5s",user);
fseek(p,1,SEEK_CUR);
fscanf(p,"%4s",pass);

if(strcmp (user, username) == 0){

if( strcmp ( pass, password) == 0){

read_dir(dir);

if (send(sd_current, dir, strlen(dir), 0) == -1) {
perror("send");
exit(1);
}

}


else{

if (send(sd_current, "202", strlen("202"), 0) == -1){
perror("send");
exit(1);}
}

}





else{
if (send(sd_current, "201", strlen("201"), 0) == -1){
perror("send");
exit(1);}
}









}
close(sd_current);

/* give client a chance to properly shutdown */
sleep(1);
}


كلاينت

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>

/* REPLACE with your server machine name*/
#define DIRSIZE 8192
main(argc, argv)
int argc; char **argv;
{
char hostname[100],portnumber[100],password[30],username[30],INVALIDUSER[30],INVALIDPASS[30],OK[5];
char dir[DIRSIZE];
int sd;
int port1;
struct sockaddr_in sin;
struct sockaddr_in pin;
struct hostent *hp;

if (argc>3)
{
strcpy(hostname,argv[1]);
strcpy(portnumber,argv[2]);
strcpy(dir,argv[3]);
}

port1=atoi(portnumber);
/* go find out about the desired host machine */
if ((hp = gethostbyname(hostname)) == 0) {
perror("gethostbyname");
exit(1);
}
/* fill in the socket structure with host information */
memset(&pin, 0, sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
pin.sin_port = htons(port1);
/* grab an Internet domain socket */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
/* connect to PORT on HOST */
if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1) {
perror("connect");
exit(1);
}
if(recv(sd,OK,sizeof(OK),0) == -1){
perror("recv");
exit(1);
}
printf("%s","username:");
scanf("%s",username);
printf("%s","password:");
scanf("%s",password);

if(send(sd,username,strlen(username),0) == -1){
perror("send");
}
if(send(sd,password,strlen(password),0) == -1){
perror("send");
exit(1);
}

/* send a message to the server PORT on machine HOST */
if (send(sd, argv[3], strlen(argv[3]), 0) == -1) {
perror("send");
exit(1);
}


/* wait for a message to come back from the server */
if (recv(sd, dir, DIRSIZE, 0) == -1) {
perror("recv");
exit(1);
printf("%s\n", dir);
}
else{
if(recv(sd,INVALIDUSER,sizeof(INVALIDUSER),0) == -1){
perror("recv");
exit(1);
}
if(recv(sd,INVALIDPASS,sizeof(INVALIDPASS),0) == -1){
perror("recv");
exit(1);}
printf("ERROR");


}
/* spew-out the results and bail out of here! */
close(sd);
}


برنامهreaddirectoryهم همون قبليه كه فرستادم