Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

Failing TCP socket bind in WINAPI

Posted on 1997-06-20
7
Medium Priority
?
711 Views
Last Modified: 2008-02-26
I am trying to create a socket server which will attach requesting clients to their own socket.  Eventualy I want each client socket to cause a new thread to spawn which
will interact with the server by sending it text information and by receiving back text  representing certain variables
present on the server.  I have the following piece of code which fails at the bind call.  What am I doing wrong?


SOCKET Server_Listening_Socket;            // Server_Listening_Socket for client
connection requests
SOCKET Requesting_Client_Socket;            // Server's accepted client requestin
socket
SOCKET Assigned_Client_Socket[20]            // Assigned Client Sockets
SOCKADDR_IN Server_Listening_Socket_Address;      // Local address and port
number
SOCKADDR_IN Assigned_Client_Socket_Address[20];      // Client Local address and
port number

struct sockaddr FAR* List_of_Clients[20];      // The address of the connecting
clients
char Local_HostName[80] ={"adds_server"};      // Servers local host name
WSADATA wsaData;

typedef struct stConnData
{
   SOCKET hsock;                        // Connection socket
   SOCKADDR_IN stRmtName;                  // Remote host address & port
   LONG lStartTime;                        // Time of connect
   BOOL bReadPending;                        // Deferred read flag
   int iBytesRcvd;                        // Data buffered
   int iBytesSent;                        // Data sent from buffer
   long lByteCount;                        // Total Bytes received
   char achIOBuf[160]                        // Network I/O data Buffer
   struct stConnData FAR*lpstNext;            // Pointer to next record
} CONNDATA, *PCONNDATA, FAR *LPCONNDATA;
LPCONNDATA lpstSockHead = 0;            // Head of the list


int Job_Requester_Socket_Server()
{
    int Client_Socket_Channel = 0;

   // We will open a socket to listen for incoming connection requests from
the client pool
   if(WSAStartup (2, &wsaDatat))
   {
      ErrorShow("Unable to initialize Winsock library.");
      return(1);
   }

   Server_Listening_Socket_Address.sin_family = PF_INET;
   Server_Listening_Socket_Address.sin_port = 8000;
   Server_Listening_Socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

   if ( Server_Listening_Socket == 0)
   {
      ErrorShow("Cannot establish connection");
      return(1);
   }
// THIS CODE IS FAILING EVERY TIME.  FOR SOME REASON bind is not working
   if ( bind ( Server_Listening_Socket,
(LPSOCKADDR)"ADDS_Server_Listening_Socket", 160))
   {
      ErrorShow("Cannot bind socket");
   }

   if ( listen ( Server_Listening_Socket, 20))
   {
      ErrorShow("Cannot Listen");
      closesocket ( Server_Listening_Socket );
      return(1);
   }

   while(1)
   {
      // Each successive client is assigned its own socket from the 20
available

      if(Client_Socket_Channel < 20)
      {
         Client_Socket_Channel++;
      }
      else
      {
         Client_Socket_Channel = 0;
      }

      // Accept connection request form Clients on the
Server_Listening_Socket

      Requesting_Client_Socket = accept (Server_Listenting_Socket,
                                    List_of_Clients[Client_Socket_Channel],
                                    NULL);

      Assigned_Client_Socket_Address[Client_Socket_Channel].sin_family =
PF_INET;
      Assigned_Client_Socket_Address[Client_Socket_Channel].sin_port = 8100
+ Client_Socket_Channel;
      Assigned_Client_Socket[Client_Socket_Channel] = socket(PF_INET,
SOCK_STREAM, IPPROTO_TCP);

      if ( Asasigned_Client_Socket[Client_Socket_Channel] == 0
      {
         ErrorShow("Cannot establish client connection");
         return (1);
      }

      if ( Bind ( Assigned_Client_Socket[Client_Socket_Channel],
                              (LPSOCKADDR)...........
.
.
.

Bind is still failing with 0 argument in the socket call.  I suspect that the problem is with the second argument to bind().  I do not understand what it is.  Can you give me a minimal example that opens a server socket?  I am sure that once I understand this, the client side will be easy.
0
Comment
Question by:sherwingw
  • 5
  • 2
7 Comments
 

Author Comment

by:sherwingw
ID: 1251523
Edited text of question
0
 

Accepted Solution

by:
aviad earned 330 total points
ID: 1251524
You should specify 0 as the third argument of the socket(...) call creating the listening socket, instead of IPPROTO_TCP.
You only specify a protocol if your socket is a SOCK_RAW type socket, which is AFAIK not supported by MSVC++ V5.0.

In short change the line:
Server_Listening_Socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
to:
Server_Listening_Socket = socket(PF_INET, SOCK_STREAM, 0);

Hope this helps.
Aviad.

0
 

Expert Comment

by:aviad
ID: 1251525
The above solution applies to the second socket(...) call as well.

Aviad.

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:sherwingw
ID: 1251526
Aviad:  The bind is still failing.  Can I think argument 2 is
the culprit.  can you give me a simple 20 or so line example including declarations and descriptions.  I do not understand what the second argument of bind is supposed to be.
0
 

Author Comment

by:sherwingw
ID: 1251527
Edited text of question
0
 

Author Comment

by:sherwingw
ID: 1251528
Edited text of question
0
 

Author Comment

by:sherwingw
ID: 1251529
Aviad:

I had also submitted this problem to Microsoft.  They have
directed me to a sample application called Wsock, which is included in the VC++ 5.0 distribution.  It does everything I need Thankyou for you help

Gary
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

972 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question