Socket Programmierung [POSIX/C]

Ich hab ein kleines Problem: ich hab einen kleinen server geschrieben der per shell-skript gestartet wird … nun, wenn ich den server von hand starte geht das ganze ohne problem (der client kann connecten), tu ich das aber eben per skript bekommt der client nur ein connection refused … hat jemand eine idee ?

Es folgen nun: Source für den Server, Source für den Client und das Startskript

/*

Dialserver - © by berni

Under GPL and Open Source

*/

#include
#include
#include
#include
#include
#include

int main()
{

int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr(„192.168.9.5“);
server_address.sin_port = 9734;
server_len = sizeof(server_address);
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

printf(„server waiting\n“);

listen(server_sockfd, 5);
while(1)
{
char ch;

// debug stuff
/* printf(„server waiting\n“); */

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);

read(client_sockfd, &ch, 1);
if(ch==‚d‘) system(„isdnctrl dial ippp0 > /dev/null“);
if(ch==‚h‘) system(„isdnctrl hangup ippp0 > /dev/null“);
// ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);

}

}

/*

A simple Network-Dialclient - © by berni

Under GPL and Open Source

*/

#include
#include
#include
#include
#include
#include
#include

int getchoice(char *greet, char *choices[]);

int main(int argc, char **argv)
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char cd = ‚d‘;
char *menu[] = {
„d - dial“,
„h - hangup“,
„q - quit“,
NULL,
};
int choice = 0;

do{

sockfd = socket(AF_INET, SOCK_STREAM, 0);

address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(„192.168.9.5“);
address.sin_port = 9734;
len = sizeof(address);

choice = getchoice(„Please select an action“, menu);
printf(„You have chosen: %c\n“, choice);

if(choice == ‚d‘)
{
printf(„Dialing\n“);
cd = ‚d‘;
}
if(choice == ‚h‘)
{
printf(„Hanging up\n“);
cd = ‚h‘;
}

if(choice == ‚q‘) exit(1);

result = connect(sockfd, (struct sockaddr *)&address, len);

if(result==-1)
{
perror(„Error: client“);
exit(1);
}

write(sockfd, &cd, 1);
read(sockfd, &cd, 1);
printf(„Answer from server = %c\n“, cd);
close(sockfd);

} while(choice != ‚q‘);

exit(0);

}

int getchoice(char *greet, char *choices[])
{
int chosen = 0;
int selected;
char **option;

do {
printf("\nChoice: %s\n", greet);
option = choices;
while(*option) {
printf("%s\n", *option);
option++;
}

do {
selected = getchar();
} while(selected== ‚\n‘);
option = choices;
while(*option) {
if(selected == *option[0]) {
chosen = 1;
break;
}
option++;
}
if(!chosen) {
printf(„Incorrect choice, select again\n“);
}
} while(!chosen);
return selected;

}

#!/bin/sh

Dial-Server start-script

ACTION=$1

case „$ACTION“ in
start)
echo „Starting dial-server“
/usr/sbin/dial_server &
;;

stop)
echo „Shutting down dial-server“
killall dial_server
;;

*)
echo „Ussage: /sbin/init.d/dial_server {start/stop}“
;;
esac

Hi,

ich bin nicht sicher, aber musst du dich vielleicht dämonisieren?
Bei SUSE gibt es glaub ich ein script/befehl (startexec oder so), der das macht.

Ist aber nur eine Vermutung. Wenn dein Prozess noch lebt, dann habe ich keine Ahnung!

Mfg Diez

danke :wink:

war genau das … jetzt funzt das ganze wunderbar

gruss

berni

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]