[ENet-discuss] simple program
Lee Salzman
lsalzman1 at cox.net
Wed Jul 20 15:11:55 PDT 2005
Flushing a connection is not a replacement for servicing it. Every
connection in ENet needs to be serviced as often as is feasible, as
there is continual back-and-forth communication between hosts. Flushing
is just a way to ensure packets get sent out before some subsequent
servicing, without reading any protocol commands off the connection.
Lee
Leon wrote:
> Hi. I've got problem with my program.. Look just at it:
>
> /* cc -o q q.c -lenet */
> #include <stdio.h>
> #include <enet/enet.h>
>
> #define error(frm, arg...) \
> do { fprintf(stderr, "error: " frm "\n", ##arg); exit(1); }
> while(0)
>
> #define debug(frm, arg...) \
> do { fprintf(stderr, "debug: " frm "\n", ##arg); } while(0)
>
> void qsend(ENetAddress *xaddr, ENetAddress *yaddr)
> {
> ENetHost *client = enet_host_create (xaddr, 1, 0, 0);
>
> if (client == NULL)
> error("enet_host_create(client)");
>
> ENetPeer *peer = enet_host_connect (client, yaddr, 1);
> if(peer == NULL)
> error("enet_host_connect()");
>
> ENetEvent event;
> if (enet_host_service (client, &event, 5000) > 0
> && event.type == ENET_EVENT_TYPE_CONNECT) {
> debug ("Connection succeeded.");
> } else {
> enet_peer_reset (peer);
> error ("Connection failed.");
> }
>
> int last_byte = 0;
> #define QBUFF 32
> char buff[QBUFF];
> do {
> int i;
> for (i=0; i<QBUFF; i++) {
> int c = getchar();
> if(c == EOF) { last_byte = 1; break; }
> buff[i] = c;
> }
>
> ENetPacket *packet = enet_packet_create (buff, i,
> ENET_PACKET_FLAG_RELIABLE);
> if (enet_peer_send(peer, 0, packet))
> error("enet_peer_send()");
> enet_host_flush (client);
> usleep(1000);
> } while(!last_byte);
>
> /* disconnecting */
> enet_peer_disconnect (& client -> peers [0]);
>
> while (enet_host_service (client, & event, 3000) > 0) {
> switch (event.type) {
> case ENET_EVENT_TYPE_RECEIVE:
> enet_packet_destroy (event.packet);
> break;
>
> case ENET_EVENT_TYPE_DISCONNECT:
> debug ("Disconnection succeeded.");
> return;
> }
> }
>
> enet_peer_reset (& client -> peers [0]);
> enet_host_destroy(client);
> }
>
> void qrecv(ENetAddress *xaddr, ENetAddress *yaddr)
> {
> ENetHost *server = enet_host_create(xaddr, 1, 0, 0);
> if(server == NULL)
> error("enet_host_create()");
>
> ENetEvent event;
> while ( enet_host_service(server, &event, 10000) > 0) {
> switch (event.type) {
> case ENET_EVENT_TYPE_CONNECT:
> debug ("A new client connected from %x:%u.\n",
> event.peer -> address.host,
> event.peer -> address.port);
> break;
>
> case ENET_EVENT_TYPE_RECEIVE:
> {
> int i;
> for(i=0; i<event.packet->dataLength;i++)
> putchar(event.packet->data[i]);
> enet_packet_destroy (event.packet);
> break;
> }
>
>
> case ENET_EVENT_TYPE_DISCONNECT:
> debug ("%s disconected.\n", event.peer -> data);
> event.peer -> data = NULL;
> break;
> }
> }
> enet_host_destroy(server);
> }
>
> int main(int argc, char **argv)
> {
> if(argc<2)
> error("usage: %s [send, receive]", argv[0]);
>
> if (enet_initialize())
> error("enet_initialize()");
>
> ENetAddress xaddr;
> ENetAddress yaddr;
> xaddr.host = ENET_HOST_ANY;
> enet_address_set_host(&yaddr, "localhost");
>
> if(argv[1][0] == 'r') {
> /* we want to receive */
> xaddr.port = 3000;
> yaddr.port = 2000;
> qrecv(&xaddr, &yaddr);
> } else {
> /* we want to send sth */
> xaddr.port = 2000;
> yaddr.port = 3000;
> qsend(&xaddr, &yaddr);
> }
>
> enet_deinitialize();
> return 0;
> }
>
> so i run two programs just like this:
> ./q receice > file
> and
> cat some_file | ./q send
>
> and it always stops after about 30Kbytes.
> usleep(1000); <-- look here
> ^^ I've been trying to change this value, but i didn't help.
> I've also been trying to chagne QBUFF size :(
>
> What i'm doing wrong?
> Thanks!
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ENet-discuss mailing list
> ENet-discuss at cubik.org
> http://lists.cubik.org/mailman/listinfo/enet-discuss
More information about the ENet-discuss
mailing list