PDA

View Full Version : BSD Socket: Send Data but never Receive


kodex
2005.06.30, 02:37 PM
Ok guys this is the last thing i need to do before i can move back to my own programming. I have 2 Apps Client/Server. The client connects to the server fine. It will let me write net data fine no problems. The issue is the data is never received by the server.

I know this stuff can be a huge pain, so if anyone can help me fix this I will paypal you $30. I know im bribing now but im sick of trying to get it to work and im comming up quick on a deadline.

Here is the code that is being used. I will also post the whole source on my site (link at end) if anyone wants to look at it.

CLIENT

int WriteNetData(int socket, void *buffer, int numBytes)
{
Ptr bytes = buffer; //ptr to buffer
int count, n;

n = count =0;

while(count< numBytes) //loop until we have sent all bytes
{
n = send(socket, bytes, numBytes - count, 0); //send..... CRASHES HERE

if(n>0)
{
count += n;
bytes += n;
}

else
if(n<0) //error
return(-1);
}

return(count);
}



static Boolean IsSocketReadyForWrite(int socket)
{
struct fd_set connectionSet;
struct timeval timeout;
int result;

//set timeout values
timeout.tv_sec =0;
timeout.tv_usec =0;

FD_ZERO(&connectionSet);
FD_SET(socket, &connectionSet);

//call select to see if data is waiting on the socket
result = select(socket+1, nil, &connectionSet, nil, &timeout);

//check results
if (result < 0 )
return (false);
if (result>0)
{
if(FD_ISSET(socket, &connectionSet))
return(true);
else
return(false);
}

return(false);
}



SERVER

Boolean IsDataWaitingToBeRead(int socket)
{
struct fd_set connectionSet;
struct timeval timeout;
int result;

//Set timeout and set values
timeout.tv_sec = 0; //no timeout
timeout.tv_usec = 0;

FD_ZERO(&connectionSet); //use our macro to clear the set
FD_SET(socket, &connectionSet); //use our macro to set socket

//Call Select to see if there is data waiting on this socket

result = select(socket+1, &connectionSet, nil, nil, &timeout);

//check results
if (result < 0) //no data
return(false);
if (result > 0)
{
if (FD_ISSET (socket, &connectionSet))
return(true); //data avaiable
else
return(false);
}

//we can never get here
return(false);
}




int ReadNetData(int socket, void *buffer, int numBytes)
{
Ptr bytes = buffer; // Ptr to buffer
int count, n;

n = count = 0;

while (count < numBytes) // loop until we've got all the bytes
{
n = recv(socket, bytes, numBytes - count, 0); // read data

if (n > 0) // we got some bytes
{
count += n; // inc byte count
bytes += n; // inc ptr to buffer
}
else
if (n < 0) // error
return(-1);
}

return(count);
}


Basicly all im trying to do is send a string over a network connection, I dont know why im having so much trouble. Ive had this work in the past, i suspect i messed up some small annoying detail.

Full Code at www.dragon-forged.com/netcode.zip

Thanks Guys!

PS. Once i get all the networking going im going to open source a real barebones version of it to make things easier for people in the future.

wadesworld
2005.07.01, 03:07 PM
Kyle,

Your problem is in your wait() routine of the server.

You're trying to read the data off the socket contained in gHostListenerSocket. However, that's no longer the correct socket since it's the listening socket.

Once you call accept on a pending connection, accept returns a new socket which is the connected socket. The listening socket remains listening. You seemed to understand this in your code when you returned the new socket from CheckForConnectionRequestFromClient(), but you then discarded that and called ReadNetData() on the listening socket, which won't work.

Your wait routine should be modified like this:


- (IBAction)wait:(id)sender
{
int connectedSocket = 0;
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

while ((connectedSocket = CheckForConnectionRequestFromClient()) < 0)
{
//we wait for the connection to be established
//since this is a server we will always be waiting
//so this loop will run for a long time
//if the code is modified make sure there
//are no memory leaks in here or it will
//result in a nasty crash.
}
printf("Connected!\n");

if (ReadNetData(connectedSocket, &number, 8) <= 0)
{
printf("Failed to read any data\n");
}


printf("Net Data: %i\n", number);
close(connectedSocket);


[pool release];
}


(Actually, rather than just closing the socket, you should probably be calling shutdown() first.)

(PS. If you really want to give money, please donate it to iDevGames)

Wade

kodex
2005.07.02, 01:56 AM
I will make a donation in your name, thanks for the help again wade.