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*


Anmelden zum Antworten