PDA

View Full Version : socket programing



Hello,World!!
جمعه 30 مهر 1389, 14:43 عصر
سلام به همه دوستان
من دو تا برنامه دارم یکی server , دیگری client
client به سرور متصل میشه و یه دستور رو برای سرور می فرسته حالا سرور باید دستور رو با تابع execvp اجرا کنه و نتیجه یا همون خروجی دستور رو به client بفرسته. مشکل اینجاس که نمیدونم خروجی execvp رو چطور به کلاینت بفرستم. این تابع int برمی گردونه. یه جا گفته بود که باید از پایپ استفاده کنم اما خیلی متوجه نشدم چطور توی c این کارو کنم. از دوستان ممنون می شم راهنماپی کنید. اگه لازمه بگید تا کد رو هم بزارم. ممنون

tdkhakpur
جمعه 30 مهر 1389, 15:03 عصر
تا اونجایی که میدونم برای اینکه سرو داده رو بگیره در حالت listen قرار میگیره یعنی همان تابع except و وقتی این تابع اجرا شد باید توسط write داده ها رو به همان sender ارسال کنید.
اگر خواستید کد را ارسال کنید.

Hello,World!!
جمعه 30 مهر 1389, 15:17 عصر
بله درسته سرور listen می کنه و دستورات رو می گیره و اجرا می کنه ولی نتیجه حاصل از اجرای دستورات درون برنامه سرور نوشته می شه برای اینکار از تابع execut استفاده می کنم که این کدشه


void execute ( char ** arg )
{
pid_t pid;
int status;
if ( (pid = fork()) < 0 ){
printf ("ERROR:: can not execute!\n");
exit (1);
}
else if ( pid == 0 )
{


if ( execvp (*arg , arg) < 0){
printf( "ERROR:: can not execute the ins..\n");
exit(1);
}
}
else
while ( wait (&status) != pid);

}

واسه چاپ کردن نتایج توی برنامه کلاینت از تابع write استفاده می کنم ولی نمیدونم واسه آرگومان دوم چی بزارم؟ اینم کد سرور


void server (){
int sockfd, newsockfd, portno, clilen;
char buffer[256];
char * argv [64];
char input [1024];
struct sockaddr_in serv_addr, cli_addr;
int n;
printf( "Enetr the port number : \n");
gets(input);
printf("\n");
parse ( input , argv );
if (argv < 1) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[0]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
n = read(newsockfd,buffer,255);
if (n < 0) error("ERROR reading from socket");
parse(buffer , argv );
n = write(newsockfd,execute(argv),1024);
if (n < 0) error("ERROR writing to socket");
n = write(newsockfd,"END OF MESSAGE",15);
if (n < 0) error("ERROR writing to socket");

}
این آخر با write مشکل دارم . این چیزی که نوشتم اشتباهه خواستم بدونید منظور م چیه تابع parse هم ورودی رو می گیره و اجزای اون (توکن ها) رو از هم جدا می کنه و توی آرایه می ریزه ممنون بابت توجهتون

tdkhakpur
جمعه 30 مهر 1389, 16:38 عصر
از sendto و recvfrom استفاده کنید برنامه شما رو نتونستم تست کنم ولی با تغییرات به شکل زیر میشه اگر مشکلی پیش اومد کل کدتان رو ارسال کنید تا اصلاح بشه.


void server (){
int sockfd, newsockfd, portno, clilen;
char buffer[256];
char * argv [64];
char input [1024];
struct sockaddr_in serv_addr, cli_addr;
int n;
printf( "Enetr the port number : \n");
gets(input);
printf("\n");
parse ( input , argv );
if (argv < 1) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[0]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
int len = sizeof(serv_addr);
n= recvfrom(newsockfd, buffer, 255, 0, &serv_addr, &len);
if (n < 0) error("ERROR reading from socket");
parse(buffer , argv );
n = sendto(newsockfd, execute(argv),1024, 0, &serv_addr, &len);
if (n < 0) error("ERROR writing to socket");
n = sendto(newsockfd,"END OF MESSAGE",15, 0, &serv_addr, &len);
if (n < 0) error("ERROR writing to socket");

}

Hello,World!!
جمعه 30 مهر 1389, 17:00 عصر
ممنونم دوسست عزیز. بازم همون خطا رو میده همون طور که توی پست قبلی گذاشتم تابع execut مقدار بازگشتی نداره و در حقیقت خروجی ها از تابع execvp میان. خطا هم به همین مربوط میشه که میگه نمی تونی void استفاده کنی. اینم کل کد


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

void parse ( char * , char ** );
void execute ( char ** );
void dirname();
void changed ( char **);


int main()
{
system("clear");
char input[1024];
char * arg[64];
while(1)
{
printf ("shell>");
gets(input);
printf("\n");
parse ( input , arg );
if ( strcmp ( arg[0] , "exit" ) == 0 )
exit(0);
if( strcmp (arg[0] , "pwd") == 0 )
dirname();
else if (strcmp ( arg[0] , "cd" ) == 0)
changed (arg);
else if (strcmp ( arg[0] , "--server" ) == 0 )
server();
else
execute ( arg );
}
}
void parse ( char * input , char ** arg )
{
while ( *input != '\0' )
{
while ( *input == ' ' || *input == '\t' || *input == '\n' )
*input++ = '\0';
*arg++ = input;
while ( *input != '\0' && *input != '\n' && *input != '\t' && *input != ' ' )
input++;
}
*arg = '\0';
}
void execute ( char ** arg )
{
pid_t pid;
int status;
if ( (pid = fork()) < 0 ){
printf ("ERROR:: can not execute!\n");
exit (1);
}
else if ( pid == 0 )
{


if ( execvp (*arg , arg) < 0){
printf( "ERROR:: can not execute the ins..\n");
exit(1);
}
}
else
while ( wait (&status) != pid);

}
void dirname (){

char* buf;
char* pointer;
buf = (char*)malloc(1024);
pointer = getcwd (buf , 1024);
printf("%s\n",pointer);
free(buf);
}
void changed (char** arg){
int result;
result = chdir ( arg[1]);
}
void server (){
int sockfd, newsockfd, portno, clilen;
char buffer[256];
char * argv [64];
char input [1024];
struct sockaddr_in serv_addr, cli_addr;
int n;
printf( "Enetr the port number : \n");
gets(input);
printf("\n");
parse ( input , argv );
if (argv < 1) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[0]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,256);
int len = sizeof(serv_addr);
n= recvfrom(newsockfd, buffer, 255, 0, &serv_addr, &len);
if (n < 0) error("ERROR reading from socket");
parse(buffer , argv );
n = sendto(newsockfd, execute(argv),1024, 0, &serv_addr, &len);
if (n < 0) error("ERROR writing to socket");
n = sendto(newsockfd,"END OF MESSAGE",15, 0, &serv_addr, &len);
if (n < 0) error("ERROR writing to socket");


}
void error ( char* msg){
perror( msg );
exit (1);
}

Hello,World!!
جمعه 30 مهر 1389, 19:09 عصر
دوستان یاری کنید:افسرده:

tdkhakpur
جمعه 30 مهر 1389, 19:57 عصر
دوست گرامی شما اول مطالب گفتید برنامه کار میکنه فقط قسمتی از کد اجرا نمیشه درصورتی که اصولا نباید این برنامه شما اجرا و connect بشه- کدهایی را که با قرمز نشان میشن را باید اضافه میکردید.


int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), (LPWSADATA)&wsaData);

system("clear");
char input[1024];
char * arg[64];
while(1)
{
printf ("shell>");
gets(input);
printf("\n");
parse ( input , arg );
if ( strcmp ( arg[0] , "exit" ) == 0 )
exit(0);
if( strcmp (arg[0] , "pwd") == 0 )
dirname();
else if (strcmp ( arg[0] , "cd" ) == 0)
changed (arg);
else if (strcmp ( arg[0] , "--server" ) == 0 )
server();
else
execute ( arg );
}
WSACleanup();
}

Hello,World!!
جمعه 30 مهر 1389, 20:29 عصر
دوست عزیز من توی linux برنامه می نویسم و برنامه رو هم فقط روی لینوکس اجرا می کنم. همونطور که گفتم برنامه بالا مشکلی نداره و اجرا میشه البته توی لینوکس