Re: socket communication: socket doesn't connect



Following your suggestion, I now moved this discussion to:
Networking and Directory Services > Networking (General) >
win32.programmer.networks at
http://msdn.microsoft.com/newsgroups/default.aspx?&lang=en&cr=US&guid=&sloc=en-us&dg=microsoft.public.win32.programmer.networks&p=1&tid=6e597362-e344-4299-84de-91835941dc4a


"Alexander Nickolov" wrote:

Forgot to mention - your question really belongs to the network
programming group:

microsoft.public.win32.programmer.networks

--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@xxxxxxxx
MVP VC FAQ: http://vcfaq.mvps.org
=====================================

"Alexander Nickolov" <agnickolov@xxxxxxxx> wrote in message
news:ulCXPSDiHHA.1456@xxxxxxxxxxxxxxxxxxxxxxx
Your server is written in C++. However, what language is your
client in? Java? C#? C++/CLI?

As far as your server code goes, you didn't post where you
accept the listening socket. With blocking socket I/O you
are supposed to spawn a new thread (or process in the original
Unix model) to handle the accepted socket and call accept
again right away. This is a terrible model for a Windows socket
server as it generates a huge amount of threads. I suggest you
investigate the other available socket programming models and
pick a better one for a server. The best scaling model is using
overlapped sockets with an I/O Completion Port (IOCP). It
is also the most complex to program. As a compromise I'd sugest
you use event-based non-blocking model via WSAEventSelect
and spawn a new thread for every 63 sockets. Combined with
a bit of thread management this should do well for a medium load
server. (The 63 comes from the limit of 64 handles you can
simultaneously wait on via WatForMultipleObjects. You need
one slot for a thread termination event, thus you have 63 slots
open for socket events. Fewer if you need additional maintenance
handles to wait for on each thread, like a waitable timer for example.)

--
=====================================
Alexander Nickolov
Microsoft MVP [VC], MCSD
email: agnickolov@xxxxxxxx
MVP VC FAQ: http://vcfaq.mvps.org
=====================================

"Ananya" <Ananya@xxxxxxxxxxxxxxxxxxxxxxxxx> wrote in message
news:E730AA77-F91F-41F4-9C1F-12A17EFBCC97@xxxxxxxxxxxxxxxx
I am trying to establish socket communication between my C++ and Java
program.

I bring up the Java program from the C++ program with ShellExecEx.

Then I start in the Java program with:
int port = 3000;
int rev = 1;
InetAddress address = InetAddress.getLocalHost();
Client client = new Client(port, address, rev);
int[] ints = new int[1];
ints[0] = 1;
client.send_ints(ints, 1);
client.closesocket();
using my Java Client class.

Then I continue in my C++ program with:
int port = 3000;
Server* server = new Server(port);
server->connectServer();
using my C++ Server class.

It looks like the server gets constructed properly and the connectServer
method calls the connect method from WinSock.h, which I have included
(and
its library WSock32.Lib is at Additional Dependences in the Input of the
Linker).

Why does this connect method from WinSock.h return - 1?

Just in case, here is the constructor of my Java Client class:
public Client(int p, InetAddress address, int rev) throws IOException,
IllegalArgumentException
{
port = p;

try
{
sock = new Socket(address, port);
input = new BufferedInputStream(sock.getInputStream(), BUFFSIZE);
output = new BufferedOutputStream(sock.getOutputStream(), BUFFSIZE);
}
catch (IOException e)
{
}
catch (IllegalArgumentException ie)
{
}

buff = new byte[BUFFSIZE];
data = new byte[BUFFSIZE];

output.write(rev);
output.flush();
}

and the constructor of my C++ Server class:
Server::Server(int p) throw (string)
{
WSAData wsaData;
if(WSAStartup(MAKEWORD(1,1),&wsaData) != 0)
{
throw string("help!");
}

port = p;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
throw string("help!");
}

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
==
-1)
{
throw string("help!");
}

if (listen(sockfd, BACKLOG) == -1)
{
throw string("help!");
}
}

Thanks for your time looking at this!





.



Relevant Pages

  • RE: call is blocked in recvfrom() and no further proceedings in Win CE
    ... In windows CE, I'm able to send a request but I'm unable to receive it. ... Create another socket & bind with server IP address. ... > My program has to send request to service through port 5070(in this port only ...
    (microsoft.public.windowsce.embedded)
  • Re: Socket, Broadcast et fileevent ?
    ... I slightly modified the IO-Multiplexed Server so that each client's ... # Perl socket stuff is based on, and very similar to, C socket stuff. ... # Use port addresses in the range 5000-6000 for the assignments. ... # When a new connection is established, ...
    (comp.lang.perl.tk)
  • Re: socket communication: socket doesnt connect
    ... Microsoft MVP, MCSD ... As far as your server code goes, ... accept the listening socket. ... Client client = new Client; ...
    (microsoft.public.vc.language)
  • Re: Definition of a socket on Suns website
    ... the server gets a new socket bound to a different port. ... It needs a new socket (and consequently a different port number) so that it can continue to listen to the original socket for connection requests while tending to the needs of the connected client. ...
    (comp.lang.java.programmer)
  • Re: millionth socket problem....
    ... > my client *is* working. ... > My server is the following, ... > use Socket; ... Your program worked for me, if I changed the port number to 7023, as ...
    (perl.beginners)