Client-server-tcp/ip-chat-room-Anwendung

Ich habe gespeichert, alle port-Nummern der client mit meinem server im verknüpften Liste.
Nachricht senden wollen, um alle clients mit server verbunden.
so client1 sendet eine Nachricht an server ,server sendet diese Nachricht an alle anderen clients angeschlossen,aber wie sollte ich den pass auf die verlinkte Liste, in der senden (), wo ich gespeichert habe alle clients .Anschlüsse.....
(ich habe verwendet TCP/IP, threading)

#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);}

- und der client-code___>>>

#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;
}

InformationsquelleAutor c-vang | 2012-04-10

Schreibe einen Kommentar