socket connect() & fread() & std::cout() = Error?

29/11/2013 - 12:52 von Heinz-Mario Frühbeis | Report spam
Hallo zusammen,

in dieser main()

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <iostream>

int main(void){
pid_t childpid;
int fd, fd1;
struct sockaddr_un addr, addr1;
std::string sockname = "IDA";
int nwait, nbind, naccept, nconnect;
if((childpid = fork()) == -1){
perror("fork"); exit(1);
}
if(childpid == 0){
fd1 = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr1, 0, sizeof(addr1));
addr1.sun_family = AF_UNIX;
addr1.sun_path[0] = '\0';
strcpy(addr1.sun_path + 1, sockname.data());
//close(3);
nconnect = connect(fd1, (struct sockaddr*)&addr1, sizeof(addr1));
std::cout<<"CONNECT CHILD" <<" "<< nconnect;
std::cout.flush();
exit(0);
} else{

FILE *pFd;
char cBf[4];
const char *npath = "/.../.../Message.txt";
size_t nsize;
pFd = fopen( npath, "r+" );
nsize = fread( cBf, sizeof( char ), 4, pFd );
std::cout<<"SIZE "<< nsize <<" "<< cBf; // <- Hier [1]
fclose( pFd );

fd = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
addr.sun_path[0] = '\0';
strcpy(addr.sun_path + 1, sockname.data());
nbind = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
listen(fd, 1);
nwait = 0;
std::cout<<"WAITING";
std::cout.flush();
while(nwait == 0){
naccept = accept(fd, NULL, NULL);
if(naccept != -1){
shutdown(fd, 2);
close(fd);
nwait = 1;
}
}
std::cout<<"ACCEPT & CLOSED";
std::cout.flush();
return(0);
}
}

kommt es zu einem Fehler, wenn ich std::cout() aufrufe.

Ohne std::cout() folgende Ausgabe:
WAITING
ACCEPT & CLOSED
CONNECT CHILD 0

Mit std::cout():
SIZE 4 msgs
WAITING
CONNECT CHILD -1
und das Programm làuft nicht durch und kann nur per 'Stopp' beendet werden.

Ich kann ohne fread() std::cout() aufrufen, aber mit fread() ergibt es
wieder einen quasi Programmabsturz.

Weiß jemand warum das so ist?

Mit Gruß
H-MF
 

Lesen sie die antworten

#1 Heinz-Mario Frühbeis
29/11/2013 - 15:25 | Warnen spam
Am 29.11.2013 12:52, schrieb Heinz-Mario Frühbeis:
Hallo zusammen,

in dieser main()

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <iostream>

int main(void){
pid_t childpid;
int fd, fd1;
struct sockaddr_un addr, addr1;
std::string sockname = "IDA";
int nwait, nbind, naccept, nconnect;
if((childpid = fork()) == -1){
perror("fork"); exit(1);
}
if(childpid == 0){
fd1 = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr1, 0, sizeof(addr1));
addr1.sun_family = AF_UNIX;
addr1.sun_path[0] = '\0';
strcpy(addr1.sun_path + 1, sockname.data());
//close(3);
nconnect = connect(fd1, (struct sockaddr*)&addr1, sizeof(addr1));
std::cout<<"CONNECT CHILD" <<" "<< nconnect;
std::cout.flush();
exit(0);
} else{

FILE *pFd;
char cBf[4];
const char *npath = "/.../.../Message.txt";
size_t nsize;
pFd = fopen( npath, "r+" );
nsize = fread( cBf, sizeof( char ), 4, pFd );
std::cout<<"SIZE "<< nsize <<" "<< cBf; // <- Hier [1]
fclose( pFd );

fd = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
addr.sun_path[0] = '\0';
strcpy(addr.sun_path + 1, sockname.data());
nbind = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
listen(fd, 1);
nwait = 0;
std::cout<<"WAITING";
std::cout.flush();
while(nwait == 0){
naccept = accept(fd, NULL, NULL);
if(naccept != -1){
shutdown(fd, 2);
close(fd);
nwait = 1;
}
}
std::cout<<"ACCEPT & CLOSED";
std::cout.flush();
return(0);
}
}

kommt es zu einem Fehler, wenn ich std::cout() aufrufe.

Ohne std::cout() folgende Ausgabe:
WAITING
ACCEPT & CLOSED
CONNECT CHILD 0

Mit std::cout():
SIZE 4 msgs
WAITING
CONNECT CHILD -1
und das Programm làuft nicht durch und kann nur per 'Stopp' beendet werden.

Ich kann ohne fread() std::cout() aufrufen, aber mit fread() ergibt es
wieder einen quasi Programmabsturz.

Weiß jemand warum das so ist?

Mit Gruß
H-MF



Ich habe jetzt mal std::cout() weggelassen.

int main(void){
pid_t childpid;
int fd, fd1, status;
struct sockaddr_un addr, addr1;
std::string sockname = "IDA";
int nwait, nbind, naccept, nconnect;
if((childpid = fork()) == -1){
perror("fork"); exit(1);
}
if(childpid == 0){
fd1 = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr1, 0, sizeof(addr1));
addr1.sun_family = AF_UNIX;
addr1.sun_path[0] = '\0';
strcpy(addr1.sun_path + 1, sockname.data());
//close(3);
nconnect = connect(fd1, (struct sockaddr*)&addr1, sizeof(addr1));
std::cout<<"CONNECT CHILD" <<" "<< nconnect;
std::cout.flush();
exit(0);
} else{
FILE *pFd;
char cBf[5];
const char *npath = "/.../.../.../msg.txt";
size_t nsize;
pFd = fopen( npath, "r+" );
nsize = fread( cBf, sizeof( char ), 4, pFd );
strcpy( cBf, "abcd" );
fseek( pFd, 0, SEEK_SET );
fwrite( cBf, sizeof( char ), 4, pFd ); // <- hier[1]
fclose( pFd );
fd = socket(AF_UNIX, SOCK_STREAM, 0);
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
addr.sun_path[0] = '\0';
strcpy(addr.sun_path + 1, sockname.data());
nbind = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
listen(fd, 1);
nwait = 0;
std::cout<<"WAITING";
std::cout.flush();
while(nwait == 0){
naccept = accept(fd, NULL, NULL);
if(naccept != -1){
shutdown(fd, 2);
close(fd);
nwait = 1;
}
}
if(wait(&status) != childpid){
std::cout<<"ERROR CHILD";
return 1;
}
std::cout<<"ACCEPT & CLOSED";
std::cout.flush();
return(0);
}
}

Wenn ich fwrite() (also bei [1]) ausführe, dann geht es bis
WAITING
CONNECT CHILD -1
und dann muss ich das Programm manuell stoppen.

Ohne fwrite() kommt
WAITING
CONNECT CHILD 0
ACCEPT & CLOSED
also kompletter Programmdurchlauf.

Woran liegt denn so was?

Mit Gruß
H-MF

Ähnliche fragen