クライアントにさらに接続されている中間ホストに接続されているサーバーのコードです。 中間サーバーの役割は、サーバーまたはクライアントからデータを取得し、それを相手側に転送することです。 2つのクライアントがデータを要求しているとします(つまり'a ')、私のサーバーには定期的なデータ用の2つのスレッドが生成されますが、クライアントが終了したいときは' b 'を送り、出かける したがって、あるリクエスト(つまり、 'b')で1つのスレッドだけが終了するように、いくつかのロジックを教えてください。cソケットプログラミング
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
void* periodic(void* t);
void* oneshot(void* t);
char value='\0',control;
static pthread_mutex_t data_lock;
int no=0,count=0;
struct transfer
{
int connec;
struct sockaddr_in client;
};
pthread_t tid1,tid3;
int main(int argc,char *argv[])
{
int sock, connected, bytes_recieved , flag,ret,true;
struct sockaddr_in server_addr,client_addr;
struct transfer t2,*t1=NULL;
t1=&t2;
int sin_size;
/*here is normal connec stablishment between server and intermidiate host*/
printf("\nTCPServer Waiting for client on port 5000");
fflush(stdout);
sin_size = sizeof(struct sockaddr_in);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
printf("\n waiting for data request from server2:.......\n");
fflush(stdout);
pthread_mutex_init(&data_lock,0);
t1->connec=connected;
t1->client=client_addr;
pthread_create(&tid3,NULL,recieve,(void*)t1);
while(1){
if(value=='\0')
continue;
if(value=='a')
{
pthread_create(&tid1,NULL,periodic,(void*)t1);
count++;
control=value;
value='\0';
}
else if(value=='b')
{
control=value;
pthread_join(tid1,NULL);
value='\0';
}
}//end of while
pthread_join(tid3,NULL);
close(connected);
}//end of main
void* periodic(void* t)
{
struct transfer *t1=(struct transfer*)t;
int data=100;
printf("periodic");
fflush(stdout);
while(1){
if(control=='b')
{count--;
data=0;
send(t1->connec,&data,sizeof(data),0);
printf("1 time\n");
break;
}
pthread_mutex_lock(&data_lock);
send(t1->connec,&data,sizeof(data),0);
pthread_mutex_unlock(&data_lock);
sleep(4);
printf("coming\n");
}
printf("comming out\n");
pthread_exit(NULL);
}//end of periodic
void* recieve(void *t)
{
struct transfer *t1=(struct transfer*)t;
char control;
while(1)
{
//control=value;
recv(t1->connec,&value,1,0);
//if(value!=control)
printf("%c\n",value);
}
printf("out of recieve\n");
fflush(stdout);
pthread_exit(NULL);
}//end of recieve
私はすべてのスレッドとその無限ループでその値をチェックする必要があるので、値globalを作成しました。中間のホストが受け取った値を継続的にチェックするためです。スレッド間でデータを共有する方法はありますか? pt。サーバーはクライアントと直接接触していません。私はサーバーと中間ホストの間に1つの接続しかありません。 – tod