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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht, Sie Durchlaufen die Liste selbst und senden Sie an jeder Steckdose.
Ich habe den code eingefügt..lassen Sie mich wissen, die änderungen erforderlich sind..ich möchte die Nachricht an alle clients mit server verbunden.server empfängt die msg von einem client und sendet dann an alle anderen clients verbunden sein, dies ist, was ich tun will.
kann jemand mehr Licht in hier........?????
Sie wissen nicht, wie der Iteration über eine Liste?
InformationsquelleAutor blueshift