socket() blockt Programm



  • Hey,

    Ich habe mir eine kleine Klasse geschrieben mit der ich Packete senden bzw. erhalten kann. Jedoch bleibt mein Programm beim Aufruf von socket() einfach stehen. Ich weiß nicht was ich falsch gemacht habe, wäre über jede Antwort erfreut 😉

    CNetwork.h

    #pragma once
    #include <WinSock2.h>
    #include <Windows.h>
    
    class CNetwork
    {
    public:
    	virtual void initWinSocks() = 0;
    	virtual void sendPacket(char *szPacket, size_t bufferSize) = 0;
    	virtual void recvPacket(char **szPacket, size_t bufferSize) = 0;
    	virtual void cleanWinSocks() = 0;
    };
    

    CNetworkTCP.h

    #pragma once
    #include "CNetwork.h"
    #include <WinSock2.h>
    #include <Windows.h>
    
    class CNetworkTCP : public CNetwork
    {
    public:
    	//Constructor & Deconstructor
    	CNetworkTCP();
    	~CNetworkTCP();
    
    	void initWinSocks();
    	void sendPacket(char *szPacket, size_t bufferSize);
    	void recvPacket(char **szPacket, size_t bufferSize);
    	void cleanWinSocks();
    
    	//TCP
    	void bindSocketOnAddress(u_short hostshort, unsigned long addr);
    	void waitAndAcceptConnection(UINT maxConnections);
    
    private:
    	SOCKET m_sAcceptSocket;
    	SOCKET m_sConnectedSocket;
    
    	WSADATA m_wsaData;
    };
    

    CNetworkTCP.cpp

    #include "CNetworkTCP.h"
    
    #include <WinSock2.h>
    #include <Windows.h>
    #include <string>
    #include <iostream>
    
    #pragma comment(lib, "ws2_32.lib")
    /************************************************************************/
    /* Construcotr & Deconstructor                                                                     */
    /************************************************************************/
    CNetworkTCP::CNetworkTCP()
    {
    	m_sAcceptSocket = 0;
    	m_sConnectedSocket = 0;
    }
    
    CNetworkTCP::~CNetworkTCP()
    {
    
    }
    
    /************************************************************************/
    /* Standart Winsocks                                                                     */
    /************************************************************************/
    
    void CNetworkTCP::initWinSocks()
    {
    	if(WSAStartup(MAKEWORD(2, 0), &m_wsaData) != 0)
    		throw std::runtime_error("WSAStartup failed");
    }
    
    void CNetworkTCP::sendPacket(char *szPacket, size_t bufferSize)
    {
    	if(send(m_sConnectedSocket, szPacket, bufferSize, 0) != bufferSize)
    		throw std::runtime_error("can't send the full packet");
    }
    
    void CNetworkTCP::recvPacket(char **szPacket, size_t bufferSize)
    {
    	if(recv(m_sConnectedSocket, *szPacket, bufferSize, 0) == -1)
    		throw std::runtime_error("Disconnected by Client");
    }
    
    void CNetworkTCP::cleanWinSocks()
    {
    	closesocket(m_sAcceptSocket);
    	closesocket(m_sConnectedSocket);
    	WSACleanup();
    }
    
    /************************************************************************/
    /*TCP                                                                      */
    /************************************************************************/
    
    void CNetworkTCP::bindSocketOnAddress(u_short hostshort, unsigned long addr)
    {
    	SOCKADDR_IN inAddr;
    
    	//Create socket
    	m_sAcceptSocket = socket(AF_INET, SOCK_STREAM, 0);
    
    	if(m_sAcceptSocket == INVALID_SOCKET)
    		throw std::runtime_error("Failed to create acceptSocket");
    
    	memset(&inAddr, 0, sizeof(SOCKADDR_IN));
    	inAddr.sin_family = AF_INET;
    	inAddr.sin_port = hostshort;
    	inAddr.sin_addr.s_addr = addr;
    
    	if(bind(m_sAcceptSocket, (SOCKADDR*)&inAddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    		throw std::runtime_error("Failed to bind acceptsocket on address");
    
    }
    
    void CNetworkTCP::waitAndAcceptConnection(UINT maxConnections)
    {
    	if(listen(m_sAcceptSocket, maxConnections) == SOCKET_ERROR)
    		throw std::runtime_error("Failed to listen socket");
    
    	m_sConnectedSocket = accept(m_sAcceptSocket, NULL, NULL);
    
    	if(m_sConnectedSocket == INVALID_SOCKET)
    		throw std::runtime_error("failed to accept socket");
    }
    

    main.cpp

    #include "CNetworkTCP.h"
    #include <Windows.h>
    #include <iostream>
    
    //Global variables
    
    int main()
    {
    	CNetworkTCP TCPnetwork;
    
    	TCPnetwork.initWinSocks();
    	TCPnetwork.bindSocketOnAddress(htons(28002), inet_addr("127.0.0.1"));
    
            //bis hierhin kommt es gar nicht
    	TCPnetwork.waitAndAcceptConnection(10);
    
    	std::cin.get();
    
    }
    


  • Also ich konnte deinem Text nicht entnehmen bis wohin es nun läuft. Ich vermute mal du meinst die Stelle, die du im Quellcode makiert hast.
    Also bei mir klappt das super. Der läuft bis TCPnetwork.waitAndAcceptConnection(10); durch und wartet dann auf Verbindungen, was ja korrekt ist.



  • Dankeschön 🙂
    Ich versuch jetzt einfach mal ein neues Projekt zu erstellen 😉


Anmelden zum Antworten