The following line is wrong:

mySocket = socket(AF_INET, SOCK_RAW, VT_UDP_SOCK);

This should be:

mySocket = socket(PF_INET, SOCK_DGRAM, 0);

Also, the host ip field of the IPv4 address "sin_addr.s_addr" is already in network byte order, so you shouldn't be using htonl() for that. Only for the port "sin_port" do you need to use htons(), since the port number you are providing is in host byte-order.

Note that you can really just reuse the enet_socket_*() and enet_address_*() functions for this, which should make things go much easier. They are not terribly documented yet, but what they do should be self-explanatory reading through unix.c. You would have to get the CVS source code of ENet (which is stable, not to worry), however, as the actual release package doesn't have some of the various functionality - like REUSEADDR - which I had recently added for this purpose.

If you use the CVS version of ENet, you can just do something like the following:

To setup client sending socket:
ENetSocket pingsock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM); // create UDP socket enet_socket_set_option(pingsock, ENET_SOCKOPT_NONBLOCK, 1); // prevent send from blocking (through must be careful to check enet_socket_send() and enet_socket_receive() for return value of 0, meaning socket is busy enet_socket_set_option(pingsock, ENET_SOCKOPT_BROADCAST, 1); // allow the socket to send to the broadcast address


To setup the server receiving socket:

ENetAddress address = /* something with fixed port value */;
ENetSocket pongock = enet_socket_create(ENET_SOCKET_TYPE_DATAGRAM);
enet_socket_set_option(pongsock, ENET_SOCKOPT_REUSEADDR, 1); // allow multiple servers on the same computer to listen to same port enet_socket_bind(pongsock, &address); // bind to the address to listen on after REUSEADDR has been set enet_socket_set_option(pongsock, ENET_SOCKOPT_NONBLOCK, 1); // no blocking again

To send data on either socket:

ENetAddress destinationAddress = /* something */;
ENetBuffer buf;
buf.data = /* pointer to data */;
buf.dataLength = /* size of data, in bytes */;
int err = enet_socket_send(socket, destinationAddress, &buf, 1);
if(err==0) { /* would have blocked, need to resend later */ }
else if(err < 0) { /* something went wrong, error! */ }

To receive data on either socket:

ENetAddress senderAddress;
ENetBuffer buf;
buf.data = /* pointer to receive buffer */;
buf.dataLength = /* size of receive buffer, in bytes */;
int received = enet_socket_receive(socket, destinationAddress, &buf, 1);
if(receive==0) { /* would have blocked, need to resend later */ }
else if(receive < 0) { /* something went wrong, error! */ }
else { /* receive says the number of bytes written into buf.data */ }

Lee

David Orejuela wrote:

I have tried to implement the solution you provided me, but there are some problems sending data and I have some questions about it:

--------

SERVER:

--------

Server socket creation doesn't return errors, but I'm not sure if I'm doing things right

--- Socket creation---

mySocket = socket(AF_INET, SOCK_RAW, VT_UDP_SOCK);

//SOCK_RAW for raw UDP traffic?

---SetSockOpt---

int reuseAddrOp = 1;

setsockopt(mySocket,SOL_SOCKET/*IPPROTO_UDP*/,SO_REUSEADDR,&reuseAddrOp,sizeof(reuseAddrOp))

//must I change option for IPPROTO_UDP or SOL_SOCKET?

---Bind---

sockaddr_in inAddress;

inAddress.sin_family = AF_INET;

inAddress.sin_port = htons(DEFAULT_PORT); //#define DEFAULT_PORT 1001

inAddress.sin_addr.s_addr = htonl(INADDR_ANY);

//is INADDR_ANY address right?

bind(mySocket,&inAddress,sizeof(inAddress));

---Listening thread---

...

do

{

FindServerRequestMessage fsr_msg;

//the sockaddr_in parameter is right? I want to listen any address...

int result = recvfrom(mySocket,&fsr_msg, sizeof(fsr_msg), 0, &inAddress, sizeof(inAddress));

if(result > 0)

{

//Get fsr_msg data and answer

}

}

while(1);

--------

CLIENT

--------

The client sends a FindServersRequest message through the socket.

When I try to send data with the "sendto" function returns me a -1, but I don't know why...

---Socket creation---

Like the server

---SetSockOpt---

Like the server

---Bind---

Like the server

---Delivery---

sockaddr_in outAddress;

outAddress.sin_family = AF_INET;

outAddress.sin_port = htons(1001);

outAddress.sin_addr.s_addr = htonl(ENET_HOST_BROADCAST); // BROADCAST sending, is it ok?

sendto(mySocket,&fsr_msg, sizeof(fsr_msg),0,&outAddress,sizeof(outAddress));

------------------------------------------------------------------------

_______________________________________________
ENet-discuss mailing list
[email protected]
http://lists.cubik.org/mailman/listinfo/enet-discuss

_______________________________________________
ENet-discuss mailing list
[email protected]
http://lists.cubik.org/mailman/listinfo/enet-discuss

Reply via email to