Socket > abstract namepsace > multiple server > bind

20/11/2013 - 16:40 von Heinz-Mario Frühbeis | Report spam
Hallo,

die folgenden Zeilen sind Teil einer Funktion, die mehrfach aufgerufen wird:
char const sockPathPrefix[] = "\0IDASocket";
size_t nSize = sizeof sockPathPrefix - 1 + vProjekt->Ident.length();
vProjekt->SockPath = new char[nSize];
memcpy( vProjekt->SockPath, sockPathPrefix, sizeof sockPathPrefix
- 1 );
memcpy( vProjekt->SockPath + sizeof sockPathPrefix - 1,
vProjekt->Ident.data(), vProjekt->Ident.length() );
if((vProjekt->fd = socket(AF_UNIX, SOCK_STREAM, 0)) > -1){
Std_CoutA("CREATED SOCKET" ,vProjekt->SockPath[nSize - (size_t) 1]
, vProjekt->fd);
memset(&vProjekt->addr, 0, sizeof(vProjekt->addr));
vProjekt->addr.sun_family = AF_UNIX;
strncpy(vProjekt->addr.sun_path, vProjekt->SockPath
, sizeof(vProjekt->addr.sun_path) - 1);
unlink(vProjekt->SockPath);
int nBind = bind(vProjekt->fd, (struct sockaddr*)&vProjekt->addr
, sizeof(vProjekt->addr));
if(nBind > -1){
Std_Cout("SHUTDOWN SOCKET", shutdown(vProjekt->fd, 2));
} else{
Std_CoutA("BIND FAILED", nBind, vProjekt->fd);
}
}

Das klappt auch soweit, nur das beim zweiten Aufruf das bind() "versagt"
(Fehler -1).
Und nun frage ich mich nun: Warum?

Ich möchte also zu jedem Projekt einen Socketserver haben, der auch nur
jeweils eine Verbindung zu entsprechendem Projekt zulàsst (also
listen(vProjekt->fd, 1)).
Wie kriegt man das denn hin?

Vorab mit Dank
H-MF
 

Lesen sie die antworten

#1 Christoph Moench-Tegeder
20/11/2013 - 18:06 | Warnen spam
## Heinz-Mario Frühbeis :

strncpy(vProjekt->addr.sun_path, vProjekt->SockPath
, sizeof(vProjekt->addr.sun_path) - 1);



Das macht vermutlich was anderes als Du vorhast, weil
vProjekt->SockPath[0] = '\0'.

Das klappt auch soweit, nur das beim zweiten Aufruf das bind() "versagt"
(Fehler -1).



Die -1 ist nur der Indikator, dass Du mal in errno schauen sollst.
Vermutlich ist errno jetzt EADDRINUSE.

Gruß,
Christoph

Spare Space

Ähnliche fragen