它是連接到進一步連接到客戶端的中間主機的服務器代碼。 中間服務器的作用是從服務器或客戶端獲取數據並在另一端轉發數據。 假設有兩個客戶端請求數據(ie'a'),所以在我的服務器中會生成兩個用於定期數據的線程,但是當任何客戶端想要退出時發送'b'並且在接收到'b'兩個線程退出。 那麼,你能否給我一些建議,以便在一個請求中只有一個線程退出(即'b')。c socket編程
#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
我做了全局值,因爲我需要檢查每個線程的值和那無限while循環是不斷檢查中間主機接收到的值。所以,有沒有其他方式來跨線程共享數據?角。是服務器不直接與客戶端聯繫,我只有服務器和中間主機之間的單一連接。 – tod