2012-03-14 2 views
0
int main() 
    { 
int sock, connected, bytes_recieved , true = 1; 
char send_data [1024] , recv_data[1024]; 
pid_t pid; 
struct sockaddr_in server_addr,client_addr; 
int sin_size; 

if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
{ 
    perror("Socket"); 
    exit(1); 
} 

if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1) 
{ 
    perror("Setsockopt"); 
    exit(1); 
} 

server_addr.sin_family = AF_INET; 
server_addr.sin_port = htons(5000); 
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 

if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) 
{ 
    perror("Unable to bind"); 
    exit(1); 
} 

if (listen(sock, 5) == -1) 
{ 
    perror("Listen"); 
    exit(1); 
} 

printf("\nTCPServer Waiting for client on port 5000\n"); 
fflush(stdout); 

while(1) 
{ 
    sin_size = sizeof(struct sockaddr_in); 
    connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size); 
    printf("\n I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port)); 
       //fork this process into a child and parent 
      pid = fork(); 

    //Check the return value given by fork(), if negative then error, 
    //if 0 then it is the child. 
      if (pid == -1) 
    { 
       perror("fork()"); 
      } 
    //loop until client closes 
    if (pid == 0) 
    { 
       /*Child Process*/ 

       close(sock); 

     while(1) 
     { 
      printf("\n SEND (q or Q to quit) : \n"); 
      gets(send_data); 

      if (strcmp(send_data , "q") == 0 || strcmp(send_data , "Q") == 0) 
      { 
       send(connected, send_data,strlen(send_data), 0); 
       close(connected); 
       break; 
      } 

      else 

       send(connected, send_data,strlen(send_data), 0); 
      bytes_recieved = recv(connected,recv_data,1024,0); 
      recv_data[bytes_recieved] = '\0'; 

      if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) 
      { 
       close(connected); 
       break; 
      } 
      else 

      printf("\n RECIEVED DATA = from(%s,%d)\ndata=%s\n" ,inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port), recv_data); 

      fflush(stdout); 
     } 
    } 
} 
close(sock); 
return 0;} 

私は、クライアントの通信にクライアントのためのスレッドを使用したいです。 しかし、スレッドを作成する方法と私はマルチクライアント通信のスレッドを作成する必要があります。 私はまた、複数のクライアントにアクセスするためにforkを使用しています。 私はtcp/ipのコンセプトを使って複数のクライアントチャットプログラムを作成したいです ありがとう!!!私のtcpserverプログラムでスレッドを使って2つのクライアント間でサーバー間の通信を行う方法はありますか?

答えて

0

ときaccept()戻っあなたは、スレッド関数にクライアント情報を渡して、クライアントのスレッドを作成することができます。あなたのコードから、あなたがそれをやっているように見えます(私は本当にコンパイルしてチェックしていませんが、それは問題ないと思われます)。だから、おそらくあなたのコードに何が間違っているかについての情報を追加することができます。

+0

私はサーバー経由で複数のクライアントからクライアントへの通信を望んでいます... と私はそれがスレッドを使用する可能性があると思う... –

+0

いずれかがアイデアを持っていれば!!!!!! –

+0

'select()'を使わなくても可能です。サーバーを中間層として機能させたいですか(たとえば、すべての通信がサーバーを最初に経由する必要があります)、またはクライアントからクライアントに直接行う必要がありますか? – LeleDumbo

関連する問題