Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
04.04.2002, 22:52
DerZelter



Ich hab da ein Problem bei einem Server für einen Chat (Konsolen-Prog). Hier erstmal der Code

Quellcode:
#include <winsock.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

#ifdef WIN32
#define close(s) closesocket(s)
#else
#define INVALID_SOCKET -1;
#endif



void add_connection( int fd );

struct connection_t
{
    int fd;
    struct connection_t *pnext;
    struct connection_t *pprev;
};                                          

struct connection_t *connlist = 0;


int s;
struct sockaddr_in my_addr;
fd_set remote_fds;
int maxfd;


void add_connection(int fd)
{
    struct connection_t *c = (struct connection_t*)malloc(sizeof(struct connection_t));
    
    memset(c, 0, sizeof(struct connection_t));

    c->fd = fd;

    FD_SET(fd, &remote_fds);

    if (fd > maxfd)
        maxfd=fd;

    if (connlist)
    {
        connlist->pnext=c;
        c->pprev=connlist;
    } else
        connlist=c;
};



int main()
{
    struct sockaddr_in addr_client;
    int clsock;
    int addrlen;
    struct connection_t *c;
    struct connection_t *c0;
    char buffer[256];
    char strtosend[10] = "welcome\n\n";

    #ifdef WIN32
    WSADATA wsa_data;
    WSAStartup(MAKEWORD(1,1), &wsa_data);
    #endif

    FD_ZERO(&remote_fds);

    s = socket(AF_INET, SOCK_STREAM, 0);

    if (s==INVALID_SOCKET)
    {
        cout << "Error in socket(): %s\n", strerror(errno);
        return -1;
    };

    my_addr.sin_family=AF_INET;
    my_addr.sin_port=htons(7000);
    my_addr.sin_addr.s_addr=INADDR_ANY;

    if (bind(s, (struct sockaddr*)&my_addr, sizeof(my_addr))==-1)
    {
        cout << "Error in bind(): %s\n", strerror(errno);
        close(s);
        return -1;
    };

    if (listen(s, 5)==-1)
    {
        cout << "Error in listen()\n";
        close(s);
        return -1;
    };

    addrlen=sizeof(addr_client);

    

    while ( 1 )
    {
        cout << "selecting...\n";

        FD_ZERO(&remote_fds);
        FD_SET(s, &remote_fds);
        maxfd=s;
        
        for( c=connlist; c; c=c->pprev )
        {
            FD_SET(c->fd, &remote_fds);
            if( c->fd>maxfd )
                maxfd=c->fd;
        };

        if( select(maxfd + 1, &remote_fds, NULL, NULL, NULL) != -1)
        {
            if( FD_ISSET(s, &remote_fds) )
            {
                cout << "accepting connection sending string...\n";
                clsock=accept(s, (struct sockaddr *)&addr_client, &addrlen);
                cout << "client connected\n";
                add_connection(clsock);

                send(clsock, strtosend, strlen(strtosend) + 1, 0);
            } else
            {
                for( c = connlist; c; c= c->pprev )
                {
                    if( FD_ISSET(c->fd, &remote_fds))
                    {
                        memset(buffer, 0, 256);
                        recv(c->fd, buffer, 256, 0);
                        cout << buffer;
                        for( c0=connlist; c0; c0=c0->pprev)
                            send(c0->fd, buffer, strlen(buffer) + 1, 0);
                    };
                };
            };
        }

    };

    close(s);


    return 0;

}

Compilieren lässt sich das Prog ohne Probs. Aber der Linker gibt folgende Fehlermeldung aus: Error: LNK2001: nicht aufgelöstes externes Symbol <...>

Dieser Fehler tritt nur bei Funktionen aus der winsock.h auf.
Please help!!

--

zum Seitenanfang zum Seitenende Profil || Suche
001
04.04.2002, 22:59
Hellfire



Ich würde spontan darauf tippen, dass du vergessen hast die wsock32.lib mitzulinken. Füg die mal bei dem Projekt-Einstellungen hinzu.

--

zum Seitenanfang zum Seitenende Profil || Suche
002
05.04.2002, 14:59
DerZelter



Oh ja, das wars. Jetzt gibt's keine Probs mehr. Das kommt davon wenn man codet ohne sich vorher mit der IDE eingehender beschäftigt zu haben *hüstel*. Hab bisher fast nur mit Delphi gecodet.
Danke für die Antwort

--

zum Seitenanfang zum Seitenende Profil || Suche
003
05.04.2002, 19:25
Mazze



Was hat die IDE damit zu tun? *confused*

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
004
07.04.2002, 17:53
DerZelter



@Mazze: VC++ ist doch nur eine IDE oder nicht, die Sprache ist doch C++. Das mit dem Linker dürfte doch auch VC++-spezifisch sein oder ist das bei allen C++ IDEs und Compilern gleich? Ich kenne nur VC++. Kann also auch gut sein, dass ich mich irre.

--

zum Seitenanfang zum Seitenende Profil || Suche
005
08.04.2002, 13:52
Mazze



das man die Lib einbindet ist, denke ich, selbstverständlich. Ich denke nicht, dass ein anderer Compiler selbstständig nach der lib suchen wird!

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
006
08.04.2002, 16:51
[RMen]OneStone



1) Ich verurteile folgendes zutiefst: "Füg die mal bei dem Projekt-Einstellungen hinzu."
Mach lieber folgende Zeile in deine Main.cpp:
#pragma comment(lib, "ws2_32.lib")
Dann kannst du das ganze auch ohne VC++ kompilieren.

2) Verwende nie das Wort Socks, wenn du Sockets meinst. Socks ist ein eigenes Protokoll (siehe z.B. RFC 1928), mit dem man Netzwerkverkehr "tunneln" kann.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
007
08.04.2002, 17:59
Prefect



Ich verurteile zutiefst: "Verwende ein #pragma"

Grundregel #1: Verwende NIE #pragmas wenn es sich _irgendwie_ vermeiden läßt. #pragmas sind im höchsten Grade unportabel (es gibt sogar Compiler, die #pragma pack nicht verstehen), denn sie sind nicht Teil des Standards. Wenn es also eine andere Lösungsmöglichkeit gibt, sollte man diese auch verwenden.
Ob man nun die .lib in die Projekt-Einstellungen einfügt oder ob man sie als Datei ins Projekt einfügt ist mir egal, aber #pragmas sind grundsätzlich evil.

Ach ja, das mit den .libs ist im Prinzip betriebssystemspezifisch. Unter *nix sind die Socketsfunktionen normalerweise in der libc drin, und die wird von allen Compilern/Linkern per default mitgelinkt, man muß also keine Bibliothek explizit linken.

cu,
Prefect

--

Widelands - Gemütliche Aufbaustrategie, Free Software
Noch ein Blog - Lerne, wie die Welt wirklich ist, aber vergiss niemals, wie sie sein sollte.

zum Seitenanfang zum Seitenende Profil || Suche
008
08.04.2002, 18:01
Kriz



zu 1.) Solange der Compiler dieses Pragma überhaupt kennt und beim Kompilieren nicht ignoriert.

zu 2.) Du scheinst ja ein richtiger Erbsenzähler zu sein... Und wenn dann richtig: Es heißt SOCKS und nicht Socks. Socks sind Socken! Und wenn du von RFC 1928 sprichst, dann schreibe gefälligst SOCKSv5, klar?

Das sind mir die liebsten, von C++ keine Ahnung und dann noch mit hochtrabenden Kommentaren hier rumspuken >:(

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
009
08.04.2002, 20:06
Mazze



Jetzt wirds aber hässlich hier... =)

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
010
08.04.2002, 22:40
Kriz



Mazze, das bezog sich nicht auf Prefi, sondern auf OneStone!

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
011
08.04.2002, 23:01
dp
Administrator


der code kommt mir aber bekannt vor o_O

--

zum Seitenanfang zum Seitenende Profil || Suche
012
09.04.2002, 12:47
Mazze



@ Kriz: Das ist mir schon klar. Wer unterstellt Prefect, dass er irgendwas nicht kann? =)

Aber wie du darauf kommst, dass OneStone kein C++ kann, weiß ich nicht!

--

BattleTech-MOD:
http://bthl.unitedgaming.net/

zum Seitenanfang zum Seitenende Profil || Suche
013
09.04.2002, 14:05
Kriz



Ach, er hatte uns letztens im Forum mal so einen "sinnvollen" Code aufgetischt, der überhaupt nicht funktionieren konnte, er aber felsenfest davon überzeugt war...

Hier ist der Thread dazu

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
014
09.04.2002, 16:43
[RMen]OneStone



@ Kriz: Was soll das heissen: "[...],von C++ keine Ahnung [...]"?
Ich habe sehr wohl Ahnung von C++! Woher willst du das überhaupt wissen? Da kann man sich ja wieder nur aufregen! Jetzt muss ich einfach mal flamen:

Du blöder &%/$&%$!
Mein Tutorial auf c-worker.ch beweist ja
wohl schonmal, dass ich C++ kann! Ausserdem bin ich kein Erbsenzähler, das
war nur ein freundlich gemeinter Hinweis, damit es nicht immer zu
Verwechslungen kommt! %$&$$!
Ich kann Coden (1)!
Ich kann Coden (2)!
Ich kann Coden (3)!

Quellcode:Q‚-oy¡qr-dv…r.-dn€-s‘yy-qv-rv{L-]v€€-qv-{vpu-tyrvpu-v{-qvr-U|€r{.
Vpu-xn{{-P88.-[‚-„rvy-q‚-€puyrpu-qn‚s-ov€.-S‚px-\ss-q‚-U‚r{€|u{.

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/


Dieser Beitrag wurde am 09.04.2002 um 16:57 von [RMen]OneStone bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
015
09.04.2002, 17:21
blair



Fehler.
Fataler Fehler.

Wie kannst du es wagen, deine plumpen beleidigungen als "flame" zu bezeichnen. Ein Flame ist eine argumentation, die das mangelnde Fachwissen oder die perfide Logik eines anderen Users aufzeigen soll, und kein

Zitat:

Du blöder &%/$&%$!

das is weder ein guter flame, noch ein schlechter flame. das ist garkein flame. das ist nochnichtmal ein troll. das ist eine beleidigung. sowas als flame zu bezeichnen grift die kultur des flamen, und damit auch jeden flamer selbst an.

sowas kann man nicht auf sich beruhen lassen...

aber wir sind ja konstruktiv, deswegen hier einkleiner einblick, wie ein flame aussehen kann:

Zitat:
[RMen]OneStone postete

@ Kriz: Was soll das heissen: "[...],von C++ keine Ahnung [...]"?
Ich habe sehr wohl Ahnung von C++! Woher willst du das überhaupt wissen? Da kann man sich ja wieder nur aufregen! Jetzt muss ich einfach mal flamen:

Kriz hat seine obige ausnahme durch zwei argumente belegt, nämlich:

Zitat:

zu 1.) Solange der Compiler dieses Pragma überhaupt kennt und beim Kompilieren nicht ignoriert.

zu 2.) Du scheinst ja ein richtiger Erbsenzähler zu sein... Und wenn dann richtig: Es heißt SOCKS und nicht Socks. Socks sind Socken! Und wenn du von RFC 1928 sprichst, dann schreibe gefälligst SOCKSv5, klar?


beides belegt das deine sachkenntnis in mindestens 2 gebieten (wobei das erste wohl schwerwiegender ist, denn aus portabilitätsgründen auf ein #pragma zu verweisen, das nicht überall implementiert ist, und zudem es sehrwohl alternativengibt, ist nicht gerade ein zeichen von sachkenntnis) mangelhaft ist.

Über die unsachgemäße benutzung des wortes flamen (-->mangelnde sachkenntnis) hab ich ja oben schon gesprochen

Zitat:

Du blöder &%/$&%$!
Mein Tutorial auf c-worker.ch beweist ja
wohl schonmal, dass ich C++ kann!

Been there, done that...
Ja ganz nett, aber erhebt dich in meinen augen nicht zum c(pp) guru, wo wir gerade dabei sind: warum welchselst "du" in den kommentaren die sprache?

Zitat:

Ausserdem bin ich kein Erbsenzähler, das
war nur ein freundlich gemeinter Hinweis, damit es nicht immer zu
Verwechslungen kommt! %$&$$!

Hmm, naja...
Zitat:

2) Verwende nie das Wort Socks, wenn du Sockets meinst. Socks ist ein eigenes Protokoll (siehe z.B. RFC 1928), mit dem man Netzwerkverkehr "tunneln" kann.

Is ja ansich nett gemeint, aber im gegensatz zu kriz würde ichs nich als erbsenzählen, sondern als posen bezeichnen...

Zitat:

Ich kann Coden (1)!

Schlechtes beispiel, laserpointer ist kindergarten... kein codingtechnisches meisterwerk...
Zitat:

Ich kann Coden (2)!

Ach zeilen löschen gilt als coden?
Zitat:

Ich kann Coden (3)!

Naja, mir sieht das eher nach nem hack aus, als nach nem richtigen feature...

Eigentlich wollte ich jetzt noch einigen bissigen kommentar ablassen, aber ich hab dann noch was besseres gefunden. Betrachtet es als collage aus Text und Code.

Zitat:
[RMen]OneStone postete

Ich kann coden [...]!

Zitat:
[RMen]OneStone postete
#include <stdio.h>
typededef struct
{
int a, b, c:
} test_t;

class CKlasse
{
public:
test_t tMyStruct;
CKlasse();
}

CKlasse::CKlasse()
{
tMyStruct = { {0, 1, 2 }, {2, 1, 0}, {0190, 666, 666} };
for(int i = 0; i < 3; i++)
printf((i == 2 ? "%i/%i-%i\n" : "%i %i %i\n"), tMyStruct[ i ].a, tMyStruct[ i ].b, tMyStruct[ i ].c);
}

--

because our freedom sits at the end of a gun
we're all here getting beat up and held back
we're all here digging knives from our backs


Dieser Beitrag wurde am 09.04.2002 um 17:22 von Blair bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
016
09.04.2002, 19:00
Kriz



...zwischendurch habe ich mir noch einen Kaffee gekocht =)

Ich weiß Blairs Argumente hier zu schätzen, aber im Grunde genommen wäre das doch nicht nötig gewesen. Wir alle wissen warum und wieso und meine Meinung über solche Menschen wie OneStone kennt man hier ja auch weithin, also von daher...

Normalerweise sehe ich über solche Antworten von diesen Halbstarken wie OneStone ja gähnend hinweg, aber beleidigen muß ich mich nicht lassen!

Zu dem Tut sage ich nur: Steht alles in der MSDN, ist also nicht der Brüller des Milleniums...

Zu den drei Tuts auf DHCC sage ich nur: Es ist ein Unterschied zwischen C/C++ programmieren und C/C++ können. Und das habe ich hier schon sehr sehr oft gesagt. Und wenn ich sehe, was du in dem Thread weiter oben für einen totalen Blödsinn gepostet hast, gehörst du zu der Sorte, die C/C++ nur programmieren, es aber nicht können. Wobei das "Können" bei C und C++ nochmals sehr different zu betrachten ist!

Also, OneStone, sei so lieb und verzieh dich wieder in deinen Clan, strick SOCKS und schreibe weiterhin fröhlich aus der MSDN ab. Ach ja, und achte in Zukunft besser darauf, wen du hier anmachst! Denn wie Al Bundy schon immer sagte: "Sohn, wenn du fest der Überzeugung bist, daß du etwas perfekt kannst, dann denke immer daran, daß es mindestens 1 Mio. Menschen auf der Welt gibt, die es garantiert besser können!"

In diesem Sinne...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
017
10.04.2002, 15:10
[RMen]OneStone



Ok...
Ich habe einen Fehler gemacht! Ich war gestern mies drauf, was das obige jedoch keinesfalls entschuldigt. Ich war etwas überheblich, das gebe ich zu. Bitte verzeiht mir nochmal!

@ Krizz: Es tut mir leid, ich war gestern echt mies drauf (ne 5 in Latein...)

SORRY!

--

georg-wicherski@pixel-house.net | http://www.pixel-house.net/ - Coding Resource| http://www.google.de/

zum Seitenanfang zum Seitenende Profil || Suche
018
10.04.2002, 15:37
Kriz



Bin ja net nachtragend...

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
019
10.04.2002, 20:04
DerZelter



Da will man eigentlich nur ne Antwort auf ne simple Frage, auf die ich als C++ Anfänger keine antwort gefunden hab und was wird draus? Ne Debatte die teilweise in nen Streit ausartet. War aber interessan zu sehen wie man mit guten Argumenten einen, der nen Fehler gemacht hat (obwohl ich ihn nicht soo schwer wiegend finde) zur Einsicht bringen kann.

@Darth Paul: Äh ja, der code basiert auf nem Listing, was ich hier im Forum gefunden hatte, hab nur hinzugefügt, dass der Server was erkriegt an alle Clients schickt. Ohne hätte Vorlage hätte ich das verwalten der Clients wohl nicht hingekriegt. Hätte ich dazu schreiben sollen, sorry.

--

zum Seitenanfang zum Seitenende Profil || Suche