Solved

Failing TCP socket bind in WINAPI

Posted on 1997-06-20
7
699 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 2
7 Comments
 

Author Comment

by:sherwingw
ID: 1251523
Edited text of question
0
 

Accepted Solution

by:
aviad earned 110 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
Technology Partners: 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

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!

Question has a verified solution.

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

An Outlet in Cocoa is a persistent reference to a GUI control; it connects a property (a variable) to a control.  For example, it is common to create an Outlet for the text field GUI control and change the text that appears in this field via that Ou…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand recursion in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.
Suggested Courses

631 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