2012-04-10 2 views
1

내 서버에 연결된 클라이언트의 모든 포트 번호를 연결된 목록에 저장했습니다. 서버에 연결된 모든 클라이언트에게 메시지를 보내려고합니다. 그래서 client1이 서버에 메시지를 보내면 서버는 연결된 다른 모든 클라이언트에게이 메시지를 전송하지만 send()에서 연결된 목록을 전달해야합니다. 모든 클라이언트는 .ports ..... (TCP/IP, 스레딩)클라이언트 서버 tcp/ip 대화방 응용 프로그램

#include <stdio.h> 

#include <stdlib.h> 



#include <string.h> 

#include <unistd.h> 

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <pthread.h> 
#define MYPORT 2012 

#define BACKLOG 10 

void *Myfunction(void *arg); 

struct NODE 
{ 
int port; 
struct NODE *next; 
}; 


void insert(struct NODE *list, int new_fd); 
void display(struct NODE *list); 
struct NODE *list; 

int new_fd; 
int n; 
    //int i,port[10],*ptr; 
char buffer[4096]; 
//char msg[] ="a"; 
int main() 
{ 
struct sockaddr_in serv_addr,cli_addr; 
int sockfd; 
int cli_len,n; 

list = (struct NODE *)malloc(sizeof(struct NODE)); 
list->port = 0 ; 
list->next = NULL; 



pthread_t thr; 

//==============socket creating==================================// 
sockfd = socket(AF_INET, SOCK_STREAM, 0); 
if(sockfd == -1) 
{ 
    printf("server- socket() err"); 
    exit(1); 
} 
else 
    printf("server-socket....... created\n"); 

bzero((char *) &serv_addr, sizeof(serv_addr)); 
//====================set info=====================================// 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(MYPORT); 
serv_addr.sin_addr.s_addr= INADDR_ANY; 

//======================bind=======================================// 
if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) 
{ 
    printf("server-bind failed"); 
    exit(1); 
} 
else 
    printf("server-socket bind....... done\n"); 

//=================listen=====================// 
if(listen(sockfd, BACKLOG) == -1) 
{ 
    printf("listen error "); 
    exit(1); 
} 
else 
    printf("server-listening....... start\n"); 

//=============client addr=================// 
cli_len = sizeof(cli_addr); 
    //printf("%d\n",cli_len); 


while(1) 
{ 
new_fd = accept(sockfd, (struct sockaddr *)&cli_addr, &cli_len); 
             insert(list, new_fd); 
             display(list); 
    /*port[i]=new_fd; 
    i++; 
    ptr=&port[i];*/ 

pthread_create(&thr ,NULL ,Myfunction ,(void *) list); 
    //printf("client joined is %s \n",inet_ntoa(cli_addr.sin_addr.s_addr)); 
printf("client joined port %d \n",cli_addr.sin_port); 

} 
    pthread_join(thr, NULL); 

return 0; 
} 


void *Myfunction(void *Arg) 
{ 
int size; 
int Client = (int)Arg; 
while(1) 
{ 

    bzero(buffer,4096); 
//size=recv(Client, buffer , sizeof(buffer) , 0); 
//buffer[size] = '\0'; 
//printf("%s\n" , buffer); 

    n = read(new_fd,buffer,4096); 
//scanf("%s", (char *) &msg); 
//send(Client,buffer,sizeof(buffer),0); 
    printf("new message: %s\n",buffer); 

    //printf("process id: %d\n", getpid()); 
    //printf("thread id: %u\n", (unsigned int)pthread_self()); 

    //fgets(buffer,4096,stdin); 
    n = write(new_fd,buffer,strlen(buffer)); 
    if (n < 0) error("ERROR writing to socket"); 

} 
    close(new_fd); 
} 

void insert(struct NODE *list, int new_fd) 
{ 
             while(list->next != NULL) 
list = list->next; 

             list->next = (struct NODE *)malloc(sizeof(struct NODE)); 
             list->next->port = new_fd; 
             list->next->next = NULL; 
} 

void display(struct NODE *list){ 
while(list->next != NULL) 
{ 
printf("%d \n", list->port); 
list = list->next; 
} 

printf("%d\n", list->port);} 

와 클라이언트 코드는 ___ >>>

#include <stdio.h> 
#include <stdlib.h>  
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 

#define DEST_PORT 2012 


int main() 
{ 
int sockfd,n; 
struct sockaddr_in serv_addr; 
struct hostent *server; 
char buffer[4096]; 
//char msg[] ="a"; 
int size; 

const char *host= "EICPU3138"; 

sockfd = socket(AF_INET, SOCK_STREAM, 0); 
printf("Client-socket() is OK...\n"); 
server = (struct hostent *)gethostbyname(host); 

bzero((char *) &serv_addr, sizeof(serv_addr)); 
serv_addr.sin_family = AF_INET; 
serv_addr.sin_port = htons(DEST_PORT); 

if(connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) == -1) 
{ 
    printf("Client-connect() error "); 
    exit(1); 
} 
else 
    printf("Client-connect() is OK...\n"); 

while(1) 
{ 
    printf(" enter message: "); 

     bzero(buffer,4096); 
     fgets(buffer,4096,stdin); 

     n = write(sockfd,buffer,strlen(buffer)); 
      if (n < 0) 
      printf("ERROR writing to socket"); 
      bzero(buffer,256); 
     //Get msg 
       /* scanf("%s", (char *) &msg); 
        //Sending message to server 
    send(sockfd,buffer,sizeof(buffer),0); 

    size=recv(sockfd , buffer , sizeof(buffer) , 0); 
    buffer[size] = '\0'; 
    printf("%s\n" , buffer);*/ 

     n = read(sockfd,buffer,4096); 
      if (n < 0) 
      error("ERROR reading from socket"); 
      printf("%s\n",buffer); 
} 
    //close(sockfd); 
printf("client out\n"); 

return 0; 
} 

답변

1

당신은, 당신은 목록을 직접 반복하고 각 소켓에 전송하지 않습니다.

+0

어떻게 반복합니까? –

+0

나는 코드를 붙여 넣었다 .. 필요한 변경 사항을 알고있다. 나는 모든 클라이언트에게 server.server에 연결된 메시지를 보내고 싶다. 한 클라이언트에서 msg를 받고, 다른 모든 클라이언트에게 보낸다. 이것이 내가 원하는 것이다. 할 것. –

+0

다른 사람이 여기에 더 많은 빛을 넣을 수 있습니까? –

관련 문제