Toon posts:

[C++/PHP] Socket programmeren

Pagina: 1
Acties:
  • 81 views sinds 30-01-2008

Verwijderd

Topicstarter
Omdat ik nog nooit met client-servers icm Visual C++ en of PHP heb gewerkt en dat toch een wil kunnen doen ga ik ik hier maar een vragen of het mogelijk is.
Ik wil namelijk het volgende bouwen:

Eén server met visual C++.
Eén client met visual C++.
Eén client in PHP (4 of 5)?

Ik heb tot nu toe alleen nog maar in Borland C gewerkt en daar kon je een client-server connectie gewoon in je applicatie slepen. Hoe doe je zo iets met Visual C++ (zonder MFC, want door kom ik nog wel eens voorbeelden van tegen).
En ook belangrijk: is het mogelijk om iets van een website (mbv php) naar die C++ server te sturen? (Ik heb al iets zitten lezen over Sockets, wat nog niet helemaal ondersteund schijnt te zijn in php 4, dus is misschien php 5 een betere optie.

Hier heb ik even een diagrammetje
Afbeeldingslocatie: http://members.lycos.nl/japsersmusic/Client%20Server.jpg
Er moet dus bijvoorbeeld een array van de php site naar de server worden gestuurd en een array van de server naar de php site of C++ client sturen.
Als dit allemaal mogelijk is dan kan ik wat specifiekere vragen gaan stellen maar tot die tijd... :P
(een paar (non MFC) socket functies aanwijzen om mij op weg te helpen mag natuurlijk ook altijd)

  • -=bas=-
  • Registratie: Oktober 2000
  • Laatst online: 17-07 05:15
Is het niet makkelijker om een CGI-script te schrijven dat de data heen en weer verschuift tussen de clients en servers?

Senile! Senile Oekaki


  • Lethalis
  • Registratie: April 2002
  • Niet online
Als je niet met de MFC klassen wilt werken, zul je de Winsock API direct moeten gebruiken. Simpele voorbeelden hiervan vind je op:

http://tangentsoft.net/wskfaq/examples/

Ask yourself if you are happy and then you cease to be.


  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
programmeer je zowel de beide clients als de server? Of is er al iets voorgeprogrammeerd?

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik weet niet in hoeverre sockets geimplementeerd zijn in php, maar een tekstbased protocol over TCP/IP moet wel kunnen volgens mij. En dan is het ook geen probleem. Je kunt natuurlijk niet zomaar een array oversturen, daar zul je een serialization mechanisme voor in moeten bouwen. PHP kan natuurlijk zelf serializen, maar dan zul je dat formaat uit moeten pluizen om het in je C++ applicatie te begrijpen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Algemeen: ik had 1 voorbeeld gevonden, die misschien zonder MFC werkte, maar voor de rest allemaal MFC. Dat ene voorbeeld was nogal uitgebreid (zeg gerust onbegrijpelijk voor de beginnende socket-programmeur)
@Grijze Vos: Ik ga beide bouwen
@.oisyn: arrays in php zijn eigenlijk gewoon tekst, geinterperteerd door de php engine of zo?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, een array is een datastructuur. En je connectie is tekst. Je zult dus die array op de een of andere manier moeten converteren naar streamable data, tekst in dit geval. Dat heet serializeren. PHP heeft daar functies voor, die kan dus een array (of elk ander type) omzetten naar een textuele representatie van die array, en andersom. Het punt is alleen dat C++ niet diezelfde functies niet heeft, dus dan zul je zelf moeten uitpluizen hoe dat serialisatie in z'n werk gaat in PHP.

Makkelijker is denk ik om een eigen serialisatie mechanisme te schrijven. Stel je hebt een array van ints, dan kun je bijvoorbeeld eerst doorsturen hoeveel elementen erin zitten, en vervolgens alle int waarden uit de array, gescheiden door komma's.

Of je maakt bijvoorbeeld gebruik van XML om je data te formatteren

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

check deze link eens http://www.ecst.csuchico.edu/~beej/guide/net/html/
php heeft wel allerlei socket functies(zo aan de namen te zien zowel streaming als dgram) maar in de .chm manual staat overal this function is experimental en vaak nauwlijks documentatie.
maar de function calls lijken erg op die van C , dus dat moet geen probleem zijn :)

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 21-02 23:50
d0t, dat vind ik niet vreemd, dat men zegt dat het experimental is, aangezien die site de laatste keer in 2001 is upgedate, als ik zo de tekst bovenaan moet geloven.

PHP kan hardstikke goed gebruik maken van sockets hoor, trust me. Ik heb een phpscript dat een socket opentrekt naar een game server (CS, UT, Q3, whatever), om daar wat leuke info op te vragen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Verwijderd

Waarom wil je zo graag een eigen socket protocol en serialisatie mechanisme implementeren?
Mechanismes als xml-rpc nemen het hele serialiseren en parseren van gegevens structuren voor hun rekening. (op google is genoeg te vinden over het gebruik van xml-rpc in combinatie met c++ of PHP)
Dit is zeker handig als je zelf nog geen socket ervaring hebt.. want dit is trickier dan het op het eerste gezicht lijkt (zeker als je enige veiligheid en robuustheid wilt)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

XML-RPC maakt gebruik van het HTTP protocol. Ik zie dat protocol niet terug in z'n diagrammetje, en het betekent dus dat z'n server (waar de C++ server app draait) het HTTP protocol moet implementeren, of een 3rd party webserver moet draaien. Het 2e lijkt me onhandig, en met het 1e maak je het moeilijker dan het al is.

Je zit iig in de goede richting, maar de oplossing die je aandraagt is imho niet de juiste :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-08 18:36
Grijze Vos schreef op 07 november 2003 @ 22:51:
d0t, dat vind ik niet vreemd, dat men zegt dat het experimental is, aangezien die site de laatste keer in 2001 is upgedate, als ik zo de tekst bovenaan moet geloven.
Als d0t het over experimental heeft dan heeft hij het waarschijnlijk over deze site. Beej's guide is de socket programming reference en daar staat volgens mij vrij weinig over PHP. Dat je het effe weet. :)

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Je kan dus sockets gebruiken of iets met een hoger abstractieniveau, maar de keuze welke je gebruikt hangt ook af van

Welk probleem wil je oplossen?

Je zou bijvoorbeeld ook een SQL database kunnen gebruiken als je probleem daar bij past. Dit zou ik niet zo snel kiezen als de server op Internet hangt maar als je in een LAN zit... Meer info nodig dus.

En "...in Borland C gewerkt en daar kon je een client-server connectie gewoon in je applicatie slepen". Bedoel je daar een TClientSocket/TServerSocket mee of een database connectie?

Verwijderd

Topicstarter
@matthijsln: Ik bedoelde inderdaad de tclient tserver socket in borland.

Ik denk dat ik nu in ieder geval iets meer snap van het hele socket-gebeuren.

Je kunt dus:
• Alleen tekst (string) sturen tussen een client en server (maakt niet uit welke programmeer taal).
• via WinSock zonder MFC werken
• PHP 4 heeft sockets al goed geimplementeerd
• Voor gewoon veel data in een array kan ik misschien beter een database of XML gebruiken.

Ik weet niet maar zijn er nog restricties aan verbonden als je alleen een console applicaties gaat maken. (server wordt console).

@Ericston: Jep die bedoel ik.
@ .oisyn & wumpus: ik ga toch wel even opzoek naar xml-rpc, want apache staat toch op de server.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Verwijderd schreef op 10 november 2003 @ 11:07:
@matthijsln: Ik bedoelde inderdaad de tclient tserver socket in borland.
Dat zijn redelijk dunne wrappers om Winsock heen, kijk maar eens in de VCL source.

Met behulp van de http://msdn.microsoft.com/ en http://tangentsoft.net/wskfaq/ is het niet zo moelijk om winsock direct te gebruiken.
Ik denk dat ik nu in ieder geval iets meer snap van het hele socket-gebeuren.

Je kunt dus:
• Alleen tekst (string) sturen tussen een client en server (maakt niet uit welke programmeer taal).
• via WinSock zonder MFC werken
• PHP 4 heeft sockets al goed geimplementeerd
• Voor gewoon veel data in een array kan ik misschien beter een database of XML gebruiken.
Je kan bytes versturen, waaronder bijvoorbeeld tekst maar ook ''binaire data" natuurlijk.

Of je beter wat anders dan kale sockets kan gebruiken hangt zoals gezegd af van het probleem dat je wilt oplossen. Misschien dat je daar iets over kan vertellen?
Ik weet niet maar zijn er nog restricties aan verbonden als je alleen een console applicaties gaat maken. (server wordt console).
Nee, niet echt, behalve als je TServerSocket etc. gebruikt maar dat doe je dus niet.

Misschien kan je zelfs beter een service maken, die je automatisch kan laten opstarten met Windows zonder dat iemand hoeft in te loggen etc.

Verwijderd

Topicstarter
@matthijsln: Wat eigenlijk het enige probleem is is dat ik gewoon moet beginnen (als extraatje voor mij zelf bij een opdracht), met een server-client connectie die op zijn minst strings, naar elkaar moet kunnen sturen. De rest komt later wel.

Ik ben nu bezig met de volgende "tutorial" annex "zoek het zelf maar uit-tekst":
http://world.std.com/~jimf/papers/sockets/winsock.html
en ben bezig met mijn eerste stapjes in de wondere wereld die "socket programmeren" heet.

Anywayz, ik heb de volgende code (onderaan heb ik de vragen gezet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "stdafx.h"
#include "WINSOCK.H"
#include <iostream>

using namespace std;

#define PORTNUM 32128 /* random port number*/

void do_something(SOCKET);
SOCKET establish(unsigned short portnum);

int main(int argc, char* argv[])
{
    WSADATA info;
    if (WSAStartup(MAKEWORD(1,1), &info) != 0) 
    {
        cout << "Initialize WinSock Failed!" << endl;
    }
    else
    {
        cout << "WinSock Initialized!" << endl;
    }

    SOCKET s;
    if ((s = establish(PORTNUM)) == INVALID_SOCKET) { /* plug in the phone */
        perror("establish");
        exit(1);
    }

    //loop for phone calls 
    for (;;) 
    {   
                                cout << "loopje" << endl;
        SOCKET new_sock = accept(s, NULL, NULL);
        if (s == INVALID_SOCKET) 
        {
            cout << "Error waiting for new connection!" << endl;
            exit(1);
        }
        do_something(new_sock);
        closesocket(new_sock);
    }

    return 0;
}

//code to establish a socket
SOCKET establish(unsigned short portnum){ 
    char   myname[256];
    SOCKET s;
    struct sockaddr_in sa;
    struct hostent *hp;

    memset(&sa, 0, sizeof(struct sockaddr_in)); // clear our address 
    gethostname(myname, sizeof(myname));        // who are we? 
    hp = gethostbyname(myname);                 // get our address info 
    if (hp == NULL) return(INVALID_SOCKET);     // we don't exist !? 
    sa.sin_family = hp->h_addrtype;             // this is our host address 
    sa.sin_port = htons(portnum);               // this is our port number 
    s = socket(AF_INET, SOCK_STREAM, 0);        // create the socket 
    if (s == INVALID_SOCKET) return INVALID_SOCKET;

    /// bind the socket to the internet address
    if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
    {
        closesocket(s);
        return(INVALID_SOCKET);
    }
    listen(s, 3);                               // max # of queued connects 
    return(s);
}

void do_something(SOCKET s)
{
    cout << "freshmeat" << endl;
}


Nu heb ik de volgende vragen:
• WSAStartup, deze opent of checkt de poorten maar staat niet bij de standaard MSDN VisualC++ documentatie, is dit dan MFC of moet ik dat anders zien?, en als de variabele niet 0 is heb ik dus geen connectie?
• Dat loopje (for (;;)) die voert hij maar een keer uit lijkt het (want dosomething cout geen string).

Hij laat eigenlijk alleen maar "WinSock Initialized!" zien en 1x loopje, als ik hem run.
De verbinding sluit hij niet af..
Wat is er fout?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 10 november 2003 @ 15:09:
Nu heb ik de volgende vragen:
• WSAStartup, deze opent of checkt de poorten maar staat niet bij de standaard MSDN VisualC++ documentatie, is dit dan MFC of moet ik dat anders zien?, en als de variabele niet 0 is heb ik dus geen connectie?
• Dat loopje (for (;;)) die voert hij maar een keer uit lijkt het (want dosomething cout geen string).

Hij laat eigenlijk alleen maar "WinSock Initialized!" zien en 1x loopje, als ik hem run.
De verbinding sluit hij niet af..
Wat is er fout?
• WSAStartup is een standaard WinSock call die gewoon bedocumenteerd is in MSDN. Dit heeft niets met MFC van doen. WSAStartup opent en checkt geen poorten, hij opent gewoon de correcte versie (1.1 in jouw geval) van de WinSocket dll
• Dat loopje bevat een accept call. Zoals je wederom in MSDN na kunt lezen blokt accept tot er een nieuwe connectie plaatsvindt. Dus iedere keer dat je met telnet oid naar het ding een verbinding maakt zal hij triggeren.

Professionele website nodig?


Verwijderd

Topicstarter
Nog even een vraagje:
Ik wil graag het IP hebben uit deze code (dus gescheiden door punten)
Alleen ik zou niet weten waar ik die ergens vandaan kan halen.
In deze "struct sockaddr_in sa;"
Staan wel socket adressen alleen geen ip (misschien op een andere manier gecodeerd.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SOCKET connect(unsigned short portnum)
{ 
    char   myname[256];
    SOCKET s;
    struct sockaddr_in sa;
    struct hostent *hp;

    memset(&sa, 0, sizeof(struct sockaddr_in)); // clear our address 
    gethostname(myname, sizeof(myname));        // who are we? 
    cout << "Servername: " << myname << endl;
    hp = gethostbyname(myname);                 // get our address info 
    if (hp == NULL) return(INVALID_SOCKET);     // we don't exist !? 
    sa.sin_family = hp->h_addrtype;             // this is our host address 
    sa.sin_port = htons(portnum);               // this is our port number
    s = socket(AF_INET, SOCK_STREAM, 0);        // create the socket 
    if (s == INVALID_SOCKET) return INVALID_SOCKET;
    if (bind(s, (struct sockaddr *)&sa, sizeof(struct sockaddr_in)) == SOCKET_ERROR)
    {
        closesocket(s);
        return(INVALID_SOCKET);
    }
    listen(s, 3);                               // max # of queued connects 
    return(s);
}


Ik heb deze functie inet_ntoa() al meerdere malen tegen gekomen, alleen hij zegt dat het niet de goede struct is.

Dus van een van die variabelen naar ip (of van hostname naar ip) of is daar gewoon een functie voor?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Ja doei ga maar eens documentatie lezen en/of een C/C++ tutorial volgen. Het is hier geen McDonalds :/

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 11 november 2003 @ 12:10:
Ja doei ga maar eens documentatie lezen en/of een C/C++ tutorial volgen.
Ehm ja, maar met een combinatie van 6 tutorials:
• MSDN 6.0 "Creating a TCP Stream Socket Application"
• MSDN 6.0 "TCP Stream Socket Client"
• Windows Sockets: A Quick and Dirty Primer" hier
• Vaag voorbeeld 1 "server_prob_1.cpp"
• Programming in Windows by Prezold "Windows Sockets"
• DNS--You say "whitehouse.gov", I say "198.137.240.92" hier

Leek het me het toch een redelijke vraag omdat namelijk het dichtst bij kwam met het laatste tutorial :hier.

Het is volgens mij redelijk simpel op te lossen maar ik kwam alleen maar of MFC voorbeelden of totaal verkeerde tegen.
Alleen die ik dus tegenkwam
code:
1
 printf("IP Address : %s\n", inet_ntoa(*((struct in_addr *)h->h_addr)));

Werkte met structs en includes die er in Visual C++ 6.0 al niet eens meer inzaten.

Dus ik zou nog een keer willen vragen of iemand mij kan helpen met het omzetten van die informatie naar een IP adres.
Het is hier geen McDonalds :/
*Negeert uitlating*

[ Voor 4% gewijzigd door Verwijderd op 11-11-2003 16:59 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je zou ook gewoon even naar de documentatie van de functies zelf kunnen kijken, dan weet je de exacte werking, welke files je moet includen en met welke libraries je moet linken. Tutorials beschrijven hoe je het zou kunnen doen, maar het is altijd beter om ook even de docs van de functies zelf erbij te pakken, zodat je het kan reproduceren.

Als je er alleen maar met voorbeelden uit kan komen dan kan deze topic natuurlijk net zo goed op slot, want dan begrijp je er namelijk zelf nog weinig van, en post je elke keer weer hier hoe iets werkt.

Alles wat je nodig hebt staat letterlijk in de MSDN, ik heb het daar zelf ook uit geleerd

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1

Dit topic is gesloten.