PDA

View Full Version : سوال: کمک فوری راجع به اشاره گرها در gcc



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";
}
:گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه::گریه::گریه: :گریه::گریه::گریه:

hsoft_project
یک شنبه 20 آذر 1390, 10:52 صبح
تو رو خدا کسی نیست کمکم کنه ؟ لطفا راهننمایی کنید

_hamid
یک شنبه 20 آذر 1390, 19:05 عصر
کدت زیاده و منم الان باید شام بخورم :دی
تک تک بگی مشکلات چیه حتما کمکت می کنم :)
در مورد
h_send_recive(&m_send,&m_recive);
&m_send غلطه! باید & رو برداری بازم لازم نیست.
یعنی بشه این
h_send_recive( m_send, m_recive);

و در مورد
(*m_send)="ok";
این یعنی چی اخه ؟!
کار با string ها یا همون char* رو یاد بگیر! و از strcpy استفاده کن.

hsoft_project
دوشنبه 21 آذر 1390, 07:26 صبح
سلام دوست عزیز . تشکر میکنم بابت پاسختون من از این روشی که شما گفتید استفاده کردم در h_send_recive( m_send, m_recive);
ولی باز پاسخ نمیده این روش ها رو هم قبلا تست کرده بودم باز پاسخ نداد مقدار m_send باید بعد از ورود به تابع پر بشه و بعد از تابع ازش استفاده کرد یعنی مقدار m_send یک مقدار out هست و باید در تابع
h_send_recive( m_send, m_recive);
پر بشه و بیاد بیرون ولی این اتفاق نمیوفته با این روشها و داخل m_send خالی هست حالا اگر راهی به ذهنتون میرسه که میشه به راحتی این کارو کرد لطفا راهنمایی کنید

hsoft_project
سه شنبه 22 آذر 1390, 20:07 عصر
کسی نیست جواب بده به من