hsoft_project
شنبه 19 آذر 1390, 21:29 عصر
با سلام و خسته نباشید من یک مشکل دارم من یک سرور تولید میکنم با سوکت بعد همزمان دریافت و ارسال میکنم و داده های دریافتی از کلاینت رو به یک تابع ارسال میکنم که ازش استفاده کنم و داده هایی که میخوام ارسال کنم از یک تابع دیگه میگیرم ولی مشکل دارم در رابطه با داده های ارسالی من از هر تابعی به جز این توابعی که استفاده میکنم الان استفاده کنم داده هایی که ارسال میشن در هم بر هم میشن مثلا تابع زیر رو که استفاده میکنم
printf("\nip address=%s",inet_ntoa(accept_addr.sin_addr));
ولی وقتی این تابع رو بر میدارم داده های ارسالی درست میشن به نظر شما مشکل از کجاست؟
در ضمن تنها با این تابع مشکل نداره با تمام تابع های که استفاده میکنم مشکل داره
خلاصه این که اشاره گر m_send که تعریف شده معلوم نیست چی میکنه در هم بر همه اقا جان حالا کمک
کده من به صورت زیر هست کاملش
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <hserver.h>
#include <signal.h>
#include <pthread.h>
#include <printf.h>
void sigchld_handler(int sd)
{
while(wait(NULL)>0);
}
uint server_start(uint portnumber)
{
int sockfd;
int thraccept; //pthread_create
pthread_t th_accept;
char *m_accept="th_accept";
struct sockaddr_in my_addr;
struct sigaction sa; // متغیری برای تولید فورک فرزن و والد
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET;
/* short, network byte order */
my_addr.sin_port = htons(portnumber);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero),'\0',8); // ست کردن ۸ مقدار در my_addr.sin_zero
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if (listen(sockfd,BACKLOG) == -1)
{
perror("listen");
exit(1);
}
sa.sa_handler=sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags=SA_RESTART;
if (sigaction(SIGCHLD,&sa,NULL)==-1)
{
perror("sigaction");
exit(1);
}
thraccept=pthread_create(&th_accept,NULL,accept_socket,(void *)sockfd);
pthread_join(th_accept,NULL);
return sockfd;
}
void *accept_socket(void *ptr)
{
char m_recive[8000] ;
char *m_send ="none"; // مشکل با این اشاره گر که یا نمیاد text داخلش یا میاد یا در هم بر همه یا یه چیزه دیگست
int thr_addr=0;
char mes[8192];
perror("server is started...!");
struct sockaddr_in accept_addr;
while(1)
{
usleep(10000);
sin_size=sizeof(struct sockaddr_in);
int * my_addr;
my_addr= (int *) ptr;
if(thr_addr=accept(my_addr,(struct sockaddr *)&accept_addr,&sin_size)==-1)
{
perror("accept");
continue;
}
if(!fork())
{
printf("user connect :");
if (recv(thr_addr,m_recive,sizeof(m_recive),0)==-1)
{
printf("hresiv r=%s",m_recive);
perror("recive ");
exit(0);
}
printf("hresiv r=%s",m_recive);
h_send_recive(&m_send,&m_recive);// و اون اشاره گر ارسال میشه به یه تابع که روش پردازش کنم
usleep(10);
int send_size = sizeof(accept_addr);
if (send(thr_addr,m_send,strlen(m_send),0)/*(,struct sockaddr *)&accept_addr,&send_size)*/==-1)
{
printf("sending item in if: %s \n",m_send);
perror("sending ");
exit(0);
}
printf("sending item : %s \n",m_send);
//printf("\nip address=%s",inet_ntoa(accept_addr.sin_addr));
}
close(thr_addr);
}
}
و تابعی که در بالا توضیح دادم به صورت زیره
void h_send_recive(char * m_send,char * m_recive)
{
printf("m_recive base massenger : %s",m_recive);
if(strcmp(m_recive,"hamed")>0)
(*m_send)="ok";
}
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه:
printf("\nip address=%s",inet_ntoa(accept_addr.sin_addr));
ولی وقتی این تابع رو بر میدارم داده های ارسالی درست میشن به نظر شما مشکل از کجاست؟
در ضمن تنها با این تابع مشکل نداره با تمام تابع های که استفاده میکنم مشکل داره
خلاصه این که اشاره گر m_send که تعریف شده معلوم نیست چی میکنه در هم بر همه اقا جان حالا کمک
کده من به صورت زیر هست کاملش
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <hserver.h>
#include <signal.h>
#include <pthread.h>
#include <printf.h>
void sigchld_handler(int sd)
{
while(wait(NULL)>0);
}
uint server_start(uint portnumber)
{
int sockfd;
int thraccept; //pthread_create
pthread_t th_accept;
char *m_accept="th_accept";
struct sockaddr_in my_addr;
struct sigaction sa; // متغیری برای تولید فورک فرزن و والد
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
my_addr.sin_family = AF_INET;
/* short, network byte order */
my_addr.sin_port = htons(portnumber);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(my_addr.sin_zero),'\0',8); // ست کردن ۸ مقدار در my_addr.sin_zero
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
{
perror("bind");
exit(1);
}
if (listen(sockfd,BACKLOG) == -1)
{
perror("listen");
exit(1);
}
sa.sa_handler=sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags=SA_RESTART;
if (sigaction(SIGCHLD,&sa,NULL)==-1)
{
perror("sigaction");
exit(1);
}
thraccept=pthread_create(&th_accept,NULL,accept_socket,(void *)sockfd);
pthread_join(th_accept,NULL);
return sockfd;
}
void *accept_socket(void *ptr)
{
char m_recive[8000] ;
char *m_send ="none"; // مشکل با این اشاره گر که یا نمیاد text داخلش یا میاد یا در هم بر همه یا یه چیزه دیگست
int thr_addr=0;
char mes[8192];
perror("server is started...!");
struct sockaddr_in accept_addr;
while(1)
{
usleep(10000);
sin_size=sizeof(struct sockaddr_in);
int * my_addr;
my_addr= (int *) ptr;
if(thr_addr=accept(my_addr,(struct sockaddr *)&accept_addr,&sin_size)==-1)
{
perror("accept");
continue;
}
if(!fork())
{
printf("user connect :");
if (recv(thr_addr,m_recive,sizeof(m_recive),0)==-1)
{
printf("hresiv r=%s",m_recive);
perror("recive ");
exit(0);
}
printf("hresiv r=%s",m_recive);
h_send_recive(&m_send,&m_recive);// و اون اشاره گر ارسال میشه به یه تابع که روش پردازش کنم
usleep(10);
int send_size = sizeof(accept_addr);
if (send(thr_addr,m_send,strlen(m_send),0)/*(,struct sockaddr *)&accept_addr,&send_size)*/==-1)
{
printf("sending item in if: %s \n",m_send);
perror("sending ");
exit(0);
}
printf("sending item : %s \n",m_send);
//printf("\nip address=%s",inet_ntoa(accept_addr.sin_addr));
}
close(thr_addr);
}
}
و تابعی که در بالا توضیح دادم به صورت زیره
void h_send_recive(char * m_send,char * m_recive)
{
printf("m_recive base massenger : %s",m_recive);
if(strcmp(m_recive,"hamed")>0)
(*m_send)="ok";
}
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه: