14-11-2000, 18:01
Hi niochmal,
ich hab ein kleines Problem.
Und zwar bin ich dabei ein Grundgerüst eines Chatservers zu schreiben
nur will das einfach nicht klappen. und zwar bringe ich es nicht fertig
ein Socket in eine Kette zu speichern.
Kannst du es dir vieleicht mal anschauen? Wichtig ist nur die Funktion
Server_loop(), die Struktur und Getsock().
Wäre echt gut.
...
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
extern struct user
{
int socket;
struct user* next;
};
struct user *root;
#define new_user() (struct user *) malloc(sizeof(struct user))
int add_user(struct user User)
{
struct user* tmp;
tmp = new_user();
tmp = root->next;
for(; http://www.linuxforen.de/ubb/wink.gif
{
if(tmp == NULL)
break;
tmp = tmp->next;
}
tmp = new_user();
*tmp = User;
}
void send_all(const char* text)
{
struct user* tmp;
tmp = new_user();
tmp = root;
for(; http://www.linuxforen.de/ubb/wink.gif
{
tmp = tmp->next;
if(tmp == NULL)
{
printf("Userlist zuende\n");
break;
}
printf("sende an user\n");
send(tmp->socket, text, strlen(text), 0);
}
}
struct user* Get_New_Sock()
{
struct user* tmp;
tmp = new_user();
tmp = root;
for(; http://www.linuxforen.de/ubb/wink.gif
{
if(tmp == NULL)
break;
tmp = tmp->next;
}
tmp = new_user();
tmp->next = NULL;
return tmp;
}
void server_loop(int* s)
{
int check, cli_size;
int* p;
char buffer[1024];
fd_set ding;
struct timeval tv;
struct sockaddr_in cli;
struct user tmp;
cli_size = sizeof(cli);
tv.tv_sec = 0;
tv.tv_usec = 5;
//tmp = new_user();
for(; http://www.linuxforen.de/ubb/wink.gif
{
FD_ZERO(&ding);
FD_SET(*s, &ding);
select(*s +1, &ding, NULL, NULL, &tv);
if(FD_ISSET(*s, &ding))
{
//tmp = Get_New_Sock();
tmp.socket = accept(*s, &cli, cli_size);
printf("Neuer besuch von %s \n", inet_ntoa(cli.sin_addr));
sprintf(buffer, "%s", "Neuer User da\n");
send(tmp.socket, buffer, strlen(buffer), 0);
add_user(tmp);
send_all(buffer);
}
}
}
int main(int argc, char *argv[])
{
int s;
struct sockaddr_in host;
s = socket(AF_INET, SOCK_STREAM, 0);
host.sin_family = AF_INET;
host.sin_addr.s_addr = INADDR_ANY;
host.sin_port = htons(12000);
if(bind(s, &host, sizeof(host)) == -1)
{
printf("Error bei bind()\n");
return 1;
}
root = new_user();
root->next = NULL;
root-> socket = 0;
listen(s, 3);
server_loop(&s);
return EXIT_SUCCESS;
}
ich hab ein kleines Problem.
Und zwar bin ich dabei ein Grundgerüst eines Chatservers zu schreiben
nur will das einfach nicht klappen. und zwar bringe ich es nicht fertig
ein Socket in eine Kette zu speichern.
Kannst du es dir vieleicht mal anschauen? Wichtig ist nur die Funktion
Server_loop(), die Struktur und Getsock().
Wäre echt gut.
...
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <netdb.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
extern struct user
{
int socket;
struct user* next;
};
struct user *root;
#define new_user() (struct user *) malloc(sizeof(struct user))
int add_user(struct user User)
{
struct user* tmp;
tmp = new_user();
tmp = root->next;
for(; http://www.linuxforen.de/ubb/wink.gif
{
if(tmp == NULL)
break;
tmp = tmp->next;
}
tmp = new_user();
*tmp = User;
}
void send_all(const char* text)
{
struct user* tmp;
tmp = new_user();
tmp = root;
for(; http://www.linuxforen.de/ubb/wink.gif
{
tmp = tmp->next;
if(tmp == NULL)
{
printf("Userlist zuende\n");
break;
}
printf("sende an user\n");
send(tmp->socket, text, strlen(text), 0);
}
}
struct user* Get_New_Sock()
{
struct user* tmp;
tmp = new_user();
tmp = root;
for(; http://www.linuxforen.de/ubb/wink.gif
{
if(tmp == NULL)
break;
tmp = tmp->next;
}
tmp = new_user();
tmp->next = NULL;
return tmp;
}
void server_loop(int* s)
{
int check, cli_size;
int* p;
char buffer[1024];
fd_set ding;
struct timeval tv;
struct sockaddr_in cli;
struct user tmp;
cli_size = sizeof(cli);
tv.tv_sec = 0;
tv.tv_usec = 5;
//tmp = new_user();
for(; http://www.linuxforen.de/ubb/wink.gif
{
FD_ZERO(&ding);
FD_SET(*s, &ding);
select(*s +1, &ding, NULL, NULL, &tv);
if(FD_ISSET(*s, &ding))
{
//tmp = Get_New_Sock();
tmp.socket = accept(*s, &cli, cli_size);
printf("Neuer besuch von %s \n", inet_ntoa(cli.sin_addr));
sprintf(buffer, "%s", "Neuer User da\n");
send(tmp.socket, buffer, strlen(buffer), 0);
add_user(tmp);
send_all(buffer);
}
}
}
int main(int argc, char *argv[])
{
int s;
struct sockaddr_in host;
s = socket(AF_INET, SOCK_STREAM, 0);
host.sin_family = AF_INET;
host.sin_addr.s_addr = INADDR_ANY;
host.sin_port = htons(12000);
if(bind(s, &host, sizeof(host)) == -1)
{
printf("Error bei bind()\n");
return 1;
}
root = new_user();
root->next = NULL;
root-> socket = 0;
listen(s, 3);
server_loop(&s);
return EXIT_SUCCESS;
}