C 在我的服务器中,我发现创建的子进程在不执行其工作的情况下异常终止
此服务器可以处理两种类型的客户端—一种请求一次性数据传输,另一种请求定期数据传输。 它等待来自客户端的控制字符启动和停止传输。 对于一次性“c”启动变速箱,对于定期“a”启动和“b”停止变速箱。 但是,当执行进入“a”的条件检查时,执行在那里停止,并且子级开始接收不可预测的值,如(032767)。 当我使用gdb检查时,它也没有显示任何关于“if(control=='a')”的内容。 你能给我一些建议来解决这个问题吗C 在我的服务器中,我发现创建的子进程在不执行其工作的情况下异常终止,c,C,此服务器可以处理两种类型的客户端—一种请求一次性数据传输,另一种请求定期数据传输。 它等待来自客户端的控制字符启动和停止传输。 对于一次性“c”启动变速箱,对于定期“a”启动和“b”停止变速箱。 但是,当执行进入“a”的条件检查时,执行在那里停止,并且子级开始接收不可预测的值,如(032767)。 当我使用gdb检查时,它也没有显示任何关于“if(control=='a')”的内容。 你能给我一些建议来解决这个问题吗 `while(1) { sin_size
`while(1)
{
sin_size = sizeof(struct sockaddr_storage);
connected = accept(sock1, (struct sockaddr *)&client_addr,&sin_size);
//connecteds[count]=connected;
//clients[count]=client_addr;
if(connected == -1){
perror("accept");
continue;
}
count++;
printf("\n%d %d\n",count,connected);
inet_ntop(client_addr.ss_family,get_in_addr((struct sockaddr *)&client_addr),s, sizeof s);
printf("server: got connection from %s\n", s);
pid=fork();
if(pid<0)perror("error in fork");
if(pid==0)
{
while(1){
int no;
char control;
printf("\n waiting for data request from clients:.......\n");
fflush(stdout);
bzero(&control,1);
while(1){
bytes_recieved = recv(connected,&control,1,0);
if(control=='a'||control=='b'||control=='c')
break;
}
r1.control1=control;
r1.client=client_addr;
send(sock,&r1,sizeof(struct recieved),0);
printf("\nreceived data request is :%c from client (%s)\n", control,s);
fflush(stdout);
if(control=='a')
{printf("..................");
struct argument *argu;
argu->dis=connected;
argu->sock=sock;
argu->cli=client_addr;
//inet_ntop(client_addr.ss_family,get_in_addr((struct sockaddr *)&client),s, sizeof s);
printf("transmission started for client:%s\n",s);
fflush(stdout);
pthread_create(&tid1,NULL,sends,(void*)argu);
pthread_create(&tid2,NULL,recieve,(void*)argu);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
control=value;
printf("comming here\n");
fflush(stdout);
}
if(control=='b')
{
printf("terminating the connection with client (%s).\n",s);
fflush(stdout);
break;
}
if(control=='c')
{
while(1){
recv(sock,&data1,sizeof(struct dataset),0);
if(data1.data==200)
break;
}
send(connected,&data1,sizeof(struct dataset),0);
printf("getting data from server %c\n%d\nterminating the connection with client (%s).\n",data1.a,data1.data,s);
fflush(stdout);
break;
}
}//end of while2
}//end of child
`while(1)
{
sin_size=sizeof(结构sockaddr_存储);
connected=accept(sock1,(结构sockaddr*)和client\u addr,以及sin\u size);
//connecteds[计数]=已连接;
//客户[计数]=客户地址;
如果(已连接==-1){
佩罗(“接受”);
继续;
}
计数++;
printf(“\n%d%d\n”,计数,已连接);
inet\u ntop(客户机地址、ss系列、get\u地址((结构sockaddr*)和客户机地址)、s、s的大小;
printf(“服务器:已从%s获得连接\n”,s);
pid=fork();
如果(piddis=已连接;
argu->sock=sock;
argu->cli=client\u addr;
//inet_ntop(客户机地址ss_系列,get_in_地址((struct sockaddr*)和客户机),s,sizeof s);
printf(“已为客户端%s\n”,s)启动传输);
fflush(stdout);
pthread_创建(&tid1,NULL,sends,(void*)argu);
pthread_创建(&tid2,NULL,receive,(void*)argu);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
控制=值;
printf(“在此提交”\n);
fflush(stdout);
}
如果(控制=='b')
{
printf(“正在终止与客户端(%s)的连接。\n”,s);
fflush(stdout);
打破
}
如果(控制=='c')
{
而(1){
recv(sock和data1,sizeof(struct-dataset),0);
如果(data1.data==200)
打破
}
发送(已连接,&data1,sizeof(struct-dataset),0);
printf(“从服务器%c获取数据\n%d\n终止与客户端(%s)的连接)。\n”、data1.a、data1.data、s);
fflush(stdout);
打破
}
}//结束时2
}//孩子的末日
`您不为
argu
指针分配内存
struct argument *argu = malloc(sizeof(struct argument));
记住释放对pthread\u join
的两次调用后的指针
编辑
更好的是,不要使用指针,只需使用以下结构:
struct argument argu;
argu.dis = connected;
/* etc. */
pthread_create(&tid1,NULL,sends,&argu);
pthread_create(&tid2,NULL,recieve,&argu);
谢谢兄弟,我愚蠢地考虑了大问题&忽略了基本问题。