c++, bsd sockets
-
ich versuche grade einen server zu bauen mit den wunderschönen bsd sockets (also libc). das problem ist, dass mir "netstat -l" anzeigt, dass dauf dem port gehört wird (*:10670), wenn ich mit aber per "telnet localhost 10670" verbinden will, sagt mir zwar telnet ich wäre verbunden, allerdings bekomme ich von select() immer nur ne 0 und verzweifle so langsam.... hat da jmd ne idee für mich?
hier der code
#include "server.h" Server::Server() { m_numClients = 0; } Server::~Server() { } bool Server::make_socket(uint16_t port) { struct sockaddr_in name; /* Create the socket. */ m_ServerSock = socket(PF_INET, SOCK_STREAM, 0); if (m_ServerSock < 0) { return false; } /* Give the socket a name. */ name.sin_family = AF_INET; name.sin_port = htons (port); name.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(m_ServerSock, (struct sockaddr *) &name, sizeof (name)) < 0) { return false; } if (listen(m_ServerSock, 5) < 0) return false; return true; } void Server::runServer() { logDebug("Binding Socket to 10670"); if (!make_socket(10670)) { logError("Failed! Exiting"); return; } // fd_set zum herusfinden ob ein socket gelesen werden kann fd_set active_fdset, read_fdset; FD_ZERO(&active_fdset); FD_ZERO(&read_fdset); struct timeval selTimeout; selTimeout.tv_sec = 0; selTimeout.tv_usec = 10; struct timespec sleepTime; struct timespec remaining; sleepTime.tv_sec = 0; sleepTime.tv_nsec = 3000; // time_t values for checking whether we need to check for events time_t last = time(NULL); time_t cur; double timeDiff; int selVal; FD_SET(m_ServerSock, &active_fdset); while (1) { // kann von einem socket gelesen werden? read_fdset = active_fdset; // solange ich nur den listening socket select()'e, sollte das mit dem ersten parameter doch gehen? selVal = select(m_ServerSock, &read_fdset, NULL, NULL, &selTimeout); if (selVal < 0) { logDebug("select(): %s", strerror(errno)); } else if (selVal > 0) { if (FD_ISSET(m_ServerSock, &read_fdset)) { logDebug("da kommt eine Verbindung rein!"); // ein neuer client! struct sockaddr clientname; // verbindung akzeptieren socklen_t sz = sizeof(clientname); int newSock = accept(m_ServerSock, &clientname, &sz); if (newSock < 0) logError("Fehler beim accept() %s", strerror(errno)); else { // client objekt erstellen und in die liste nehmen char* buf = "test"; send(newSock, buf, 4, 0); logDebug("neuer Client"); } } else { // ein client will was von uns } } else { cur = time(NULL); timeDiff = difftime(cur, last); } nanosleep(&sleepTime, &remaining); } }
-
selVal = select(m_ServerSock + 1, &read_fdset, NULL, NULL, &selTimeout);
-
dann bekomme ich bei jedem schleifendurchlauf eine 1 und accept sagt mir was von "üngültiges argument"... leider
argh ich habs eben noch mal probiert häääää? warum geht das jetzt??? *lalala* hab nix gesagt... danke dir!
-
die FD_* makros wollen keine pointer.
-
c.rackwitz schrieb:
die FD_* makros wollen keine pointer.
Öh, wie bitte?
Du erklärst gerade 5 Jahre C-Programmierung für ungültig!
-
libc manual schrieb:
void FD_ZERO (fd_set *set)
void FD_SET (int filedes, fd_set *set)
void FD_CLR (int filedes, fd_set *set)
int FD_ISSET (int filedes, fd_set *set)*hust*