rxenon
25-06-2007, 15:15
Hallo!
Ich habe angefangen in C einen TCP Server zu implementieren. Später mal soll das ganze als Chat Server dienen oder auch für anderes.
Was bisher funktioniert, ist, dass der Server einen Socket erstellt und auf diesem auf einen Client wartet. Dann wird ein weiterer Socket erstellt zu dem Clienten. Das ganze, damit sich später auch mehrere Clienten anmelden können.
Zu dem angemeldeten Client kann ich auch problemlos Bytes senden (der client ist erstmal telnet von linux).
Jetzt kommen die Probleme:
1. Wenn ich Daten vom Client empfangen will, kommen immer nur 3 Zeichen an. Am Buffer zum einlesen kann das aber nicht liegen, da er String 1024 Zeichen lang ist.
2. Benutze ich telnet.exe (von Windows XP) um auf den Server zuzugreifen, dann wird jedes Zeichen direkt gesendet. Bei Linux wird immer gewartet, bis der Benutzer Enter drückt, bevor gesendet wird. Bei Windows hingegen wird jedes Zeichen direkt gesendet. Gibt es eine Möglichkeit für den Server erst aufzuhören mit empfangen, bis der Telnet Benutzer Enter gedrückt hat? Vlt. hat jemand Erfahrung mit den Besonderheiten der telnet.exe .
Das hier ist noch mein Code, falls jemand den braucht:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> //declaration of 'sockaddr_in'
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
int tcp_server_send(int fd, char buffer[]) {
int result;
result = send(fd, buffer, strlen(buffer), 0);
if(result==-1 ) perror("send failure");
return result;
}
int tcp_server_receive(int fd, char buffer[]) {
int bytes;
bytes = recv(fd, buffer, sizeof(buffer)-1, 0);
if(bytes==-1) perror("receive failure");
buffer[bytes] = '\0';
return bytes;
}
int tcp_server_init(int port) {
struct sockaddr_in addr;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd==-1) perror("Could not create socket");
addr.sin_port = htons(port);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1 ) perror("Could not bind socket");
if( listen(fd, 3) == -1 ) perror("listen to socket failed");
return fd;
}
int main(int argc, char *argv[]) {
struct sockaddr_in cli_info;
int listen_sock, client, cli_size;
char name[1024], buffer[1024];
if(argc!=2) {
printf("usage: %s port\n", argv[0]);
return 1;
}
listen_sock = tcp_server_init(atoi(argv[1]));
cli_size = sizeof(cli_info);
for(;;) {
client = accept(listen_sock, (struct sockaddr *) &cli_info, &cli_size);
tcp_server_send(client, "Welcome!\n\tusername: ");
tcp_server_receive(client, name);
//sprintf(buffer, "\nYour name is: %s\n", name);
//tcp_server_send(client, buffer);
close(client);
printf("username: %s\n", name);
break;
}
}
Ich habe angefangen in C einen TCP Server zu implementieren. Später mal soll das ganze als Chat Server dienen oder auch für anderes.
Was bisher funktioniert, ist, dass der Server einen Socket erstellt und auf diesem auf einen Client wartet. Dann wird ein weiterer Socket erstellt zu dem Clienten. Das ganze, damit sich später auch mehrere Clienten anmelden können.
Zu dem angemeldeten Client kann ich auch problemlos Bytes senden (der client ist erstmal telnet von linux).
Jetzt kommen die Probleme:
1. Wenn ich Daten vom Client empfangen will, kommen immer nur 3 Zeichen an. Am Buffer zum einlesen kann das aber nicht liegen, da er String 1024 Zeichen lang ist.
2. Benutze ich telnet.exe (von Windows XP) um auf den Server zuzugreifen, dann wird jedes Zeichen direkt gesendet. Bei Linux wird immer gewartet, bis der Benutzer Enter drückt, bevor gesendet wird. Bei Windows hingegen wird jedes Zeichen direkt gesendet. Gibt es eine Möglichkeit für den Server erst aufzuhören mit empfangen, bis der Telnet Benutzer Enter gedrückt hat? Vlt. hat jemand Erfahrung mit den Besonderheiten der telnet.exe .
Das hier ist noch mein Code, falls jemand den braucht:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> //declaration of 'sockaddr_in'
#include <sys/time.h>
#include <unistd.h>
#include <string.h>
int tcp_server_send(int fd, char buffer[]) {
int result;
result = send(fd, buffer, strlen(buffer), 0);
if(result==-1 ) perror("send failure");
return result;
}
int tcp_server_receive(int fd, char buffer[]) {
int bytes;
bytes = recv(fd, buffer, sizeof(buffer)-1, 0);
if(bytes==-1) perror("receive failure");
buffer[bytes] = '\0';
return bytes;
}
int tcp_server_init(int port) {
struct sockaddr_in addr;
int fd;
fd = socket(AF_INET, SOCK_STREAM, 0);
if(fd==-1) perror("Could not create socket");
addr.sin_port = htons(port);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if( bind(fd, (struct sockaddr *) &addr, sizeof(addr)) == -1 ) perror("Could not bind socket");
if( listen(fd, 3) == -1 ) perror("listen to socket failed");
return fd;
}
int main(int argc, char *argv[]) {
struct sockaddr_in cli_info;
int listen_sock, client, cli_size;
char name[1024], buffer[1024];
if(argc!=2) {
printf("usage: %s port\n", argv[0]);
return 1;
}
listen_sock = tcp_server_init(atoi(argv[1]));
cli_size = sizeof(cli_info);
for(;;) {
client = accept(listen_sock, (struct sockaddr *) &cli_info, &cli_size);
tcp_server_send(client, "Welcome!\n\tusername: ");
tcp_server_receive(client, name);
//sprintf(buffer, "\nYour name is: %s\n", name);
//tcp_server_send(client, buffer);
close(client);
printf("username: %s\n", name);
break;
}
}