Why TCP ECHO Not Work between distant Hosts?



Hi! I'm June.
This time I have this question:
TCP ECHO works well if I run both TCPServer.EXE and TCPClient.EXE in
the same computer.

However, it didn't work if I run these two programs in serparate
computers.
At a Server with IP 163.239.209.16, I typed,
c:\> TCPServer 9019

And at client computer I typed,
c:\>TCPClient 163.239.209.16 9019

Then TCPClient.EXE says "connect() error!"

What is wrong? I'd be grateful if you tell me:p


-For reference I put both TCPServer.EXE and TCPClient.EXE
1. TCPServer.EXE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>


#define BUFSIZE 1024
void ErrorHandling(char *message);

int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET hServSock;
SOCKET hClntSock;
char message[BUFSIZE];

int strLen;

SOCKADDR_IN servAddr;
SOCKADDR_IN clntAddr;

int clntAddrSize;

if(argc!=2){
printf("Usage : %s <port>\n", argv[0]); /* Usage */
exit(1);
}

if(WSAStartup(MAKEWORD(2, 2), &wsaData) !=0) /* load winsock 2.2
dll*/
ErrorHandling("WSAStartup() error!");

hServSock=socket(PF_INET, SOCK_STREAM, 0); /* Set to IPv4, TCP */
if(hServSock == INVALID_SOCKET)
ErrorHandling("socket() error");

memset(&servAddr, 0, sizeof(servAddr)); /* initialization of
structure */
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=htonl(INADDR_ANY); /* IP allocation */
servAddr.sin_port=htons(atoi(argv[1]));

if(bind(hServSock, (SOCKADDR*) &servAddr,
sizeof(servAddr))==SOCKET_ERROR)
ErrorHandling("bind() error"); /* bind */

if(listen(hServSock, 5)==SOCKET_ERROR)
ErrorHandling("listen() error"); /* listen */

clntAddrSize=sizeof(clntAddr);
hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr, &clntAddrSize);
if(hClntSock==INVALID_SOCKET)
ErrorHandling("accept() error"); /* accept */


/*----------------------------------------------------------------------------------*/
/* core of echo server : Server displays data on Server console,
and returns data back to client */

while( (strLen=recv(hClntSock, message, BUFSIZE, 0)) !=0){
send(hClntSock, message, strLen, 0);
message[strLen] = '\0'; /* I put null terminator
for received message */
printf("%7s\n", message); /* Display received message
on Server console */

}
/*----------------------------------------------------------------------------------*/

closesocket(hClntSock); /* end */
WSACleanup();
return 0;
}

void ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}


2. TCPClient
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUFSIZE 1024
void ErrorHandling(char *message);

int main(int argc, char **argv)
{
WSADATA wsaData;
SOCKET hSocket;
char message[BUFSIZE];
int strLen;

SOCKADDR_IN servAddr;

if(argc!=3)
{
printf("Usage : %s <IP> <port>\n", argv[0]); /* Usage */
exit(1);
}

if(WSAStartup(MAKEWORD(2, 2), &wsaData) !=0) /* load winsock 2.2
dll*/
ErrorHandling("WSAStartup() error!");

hSocket=socket(PF_INET, SOCK_STREAM, 0); /* set to IPv4,
TCP */

if(hSocket == INVALID_SOCKET)
ErrorHandling("socket() error"); /* generate socket
*/

memset(&servAddr, 0, sizeof(servAddr)); /* structure
initialization */
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(argv[1]);
servAddr.sin_port=htons(atoi(argv[2]));

if(connect(hSocket, (SOCKADDR*)&servAddr,
sizeof(servAddr))==SOCKET_ERROR)
ErrorHandling("connect() error!"); /* connect */

while(1)
{
fputs("Enter message to send! (Q to quit) : ", stdout);
fgets(message, BUFSIZE, stdin); /* input from
keyboard */
if(!strcmp(message, "q\n")) /* Q to quit */
break;


/* --------------------------ECHO
CORE------------------------------*/

send(hSocket, message, strlen(message),0); /* send msg */
strLen=recv(hSocket, message, BUFSIZE-1, 0); /* receive msg */

/*------------------------------------------------------------------------*/

message[strLen]=0;
printf("Echo from Server : %s \n", message);
}

closesocket(hSocket);
WSACleanup();
return 0;
}

void ErrorHandling(char *message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}


-------------------------------
Thank you for reading and I hope you can help me:p

.



Relevant Pages

  • problem with the udp socket
    ... The sockets are created and I am able to bind also both the client and the ... server apps to the port and the ethereal shows that data is being transferred ... int s, i, slen=sizeof; ... WSADATA wsaData; ...
    (microsoft.public.pocketpc.developer.networking)
  • SSPI Kerberos for delegation
    ... security context created in server to connect back and authenticate to ... DWORD bufsiz = sizeof buf; ... int n = ib.cbBuffer; ... // wserr() displays winsock errors and aborts. ...
    (microsoft.public.win32.programmer.kernel)
  • SSPI delegation using kerberos
    ... security context created in server to connect back and authenticate to ... DWORD bufsiz = sizeof buf; ... int n = ib.cbBuffer; ... // wserr() displays winsock errors and aborts. ...
    (microsoft.public.platformsdk.security)
  • SSPI Kerberos for delegation
    ... security context created in server to connect back and authenticate to ... DWORD bufsiz = sizeof buf; ... int n = ib.cbBuffer; ... // wserr() displays winsock errors and aborts. ...
    (microsoft.public.platformsdk.security)
  • SSPI Kerberos for delegation
    ... security context created in server to connect back and authenticate to ... DWORD bufsiz = sizeof buf; ... int n = ib.cbBuffer; ... // wserr() displays winsock errors and aborts. ...
    (microsoft.public.security)