Hi all,
I am new to socket messaging and karel programming and I am trying to establish a connection between roboguide (being the server) and my pc (being the client) via a C++ program but it won't work.
I followed the Karel documentation on socket messaging to setup the server tag, but it doesn't mention to add a port number or a server IP, should I? As for the system variable $HOSTS_CFG[3], I've only configure the $SERVER_PORT to a random value: 8000.
I've done multiple tests with different server_port (in $HOSTS_CFG[3] menu) numbers and server_IP value (in Host_Comm menu) such as the loopback IP adress 127.0.0.1 or the controller IP adress but nothing seems to work. Am i missing something?
Here is my Karel code:
Code
PROGRAM PG_BGTASK
%STACKSIZE = 4000
%NOLOCKGROUP
%NOPAUSE = ERROR + COMMAND + TPENABLE -- This program runs even when the Teach pendant is enabled
%ENVIRONMENT uif
%ENVIRONMENT sysdef
%ENVIRONMENT memo
%ENVIRONMENT kclop
%ENVIRONMENT bynam
%ENVIRONMENT fdev
%ENVIRONMENT flbt
%INCLUDE klevccdf
%INCLUDE klevkeys
%INCLUDE klevkmsk
VAR
file_var : FILE
tmp_int : INTEGER
tmp_int1 : INTEGER
tmp_str : STRING[128]
tmp_str1 : STRING[128]
status : INTEGER
entry : INTEGER
bStopBGTask : BOOLEAN
-- Main program body
BEGIN
bStopBGTask = FALSE
SET_FILE_ATR (file_var, ATR_IA)
-- set the server port before doing a connect
SET_VAR (entry, '*SYSTEM*', '$HOSTS_CFG[3].$SERVER_PORT',8000, status)
WRITE ( ' Connect Status = ', status,CR)
WRITE ( ' connecting.. ' , CR)
MSG_CONNECT( 'S3: ' , status)
WRITE ( ' Connect Status = ', status,CR)
IF status = 0 THEN
-- OPEN S3:
WRITE ( ' Opening' , CR)
REPEAT
FOR tmp_int1 = 1 TO 20 DO
OPEN FILE file_var ('rw', 'S3: ')
status = IO_STATUS (FILE_VAR)
WRITE (status, CR)
IF status = 0 THEN
-- write an Integer
FOR tmp_int = 1 TO 1000 DO
WRITE ( 'Reading' , CR)
-- Read 10 bytes
BYTES_AHEAD(FILE_VAR, entry, status)
WRITE (entry, status, CR)
READ file_var (tmp_str::10)
status = IO_STATUS (FILE_VAR)
WRITE (status, CR)
-- Write 10 bytes
WRITE (tmp_str::10, CR)
Status = IO_STATUS (FILE_VAR)
WRITE (status, CR)
ENDFOR
CLOSE FILE file_var
ENDIF
ENDFOR
UNTIL bStopBGtask
WRITE ( 'Disconnecting. . ' , CR)
MSG_DISCO('S3: ' , status)
WRITE ( 'Done. ' ,CR)
ENDIF
WRITE ( ' PG_BGTASK EXITING.. ' , CR)
END PG_BGTASK
Display More
And here is my c++ code:
C
/****************** CLIENT CODE ****************/
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <stdio.h>
#include <winsock2.h>
#include <string>
#include <iostream>
using namespace std;
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
#define AF_INET 2
#define IPPROTO_TCP 6
#define SCK_VERSION1 0x0101
#define SCK_VERSION2 0x0202
#pragma comment(lib, "Ws2_32.lib")
SOCKET s; //Socket handle
bool connectToServer(int PortNo, char* IPAddress);
void closeConnection();
int main() {
bool result;
int port = 8000;
char adressIP[] = "127.0.0.1"; //loopback
result = connectToServer(port, adressIP);
cout << "Socket Result is " << result << endl;
cin.get();
closeConnection();
}
//CONNECTTOHOST – Connects to a remote host
bool connectToServer(int PortNo, char* IPAddress)
{
//Start up Winsock…
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
//Did something happen?
if (error)
{
cout << "Error in winsock startup" << endl;
return false;
}
cout << "Success winsock startup" << endl;
//Did we get the right Winsock version?
if (wsadata.wVersion != 0x0202)
{
WSACleanup(); //Clean up Winsock
cout << "Error in Winsock version" << endl;
return false;
}
cout << "Success winsock version" << endl;
//Fill out the information needed to initialize a socket…
SOCKADDR_IN target; //Socket address information
target.sin_family = AF_INET; // address family Internet
//target.sin_port = htons (PortNo); //Port to connect on
target.sin_port = PortNo;
target.sin_addr.s_addr = inet_addr(IPAddress); //Target IP
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //Create socket
if (s == INVALID_SOCKET)
{
cout << "Error in creating socket" << endl;
return false; //Couldn't create the socket
}
cout << "Success creating socket" << endl;
//Try connecting...
if (connect(s, (SOCKADDR*)&target, sizeof(target)) == SOCKET_ERROR)
{
cout << "Error in connecting socket" << endl;
return false; //Couldn't connect
}
else
{
cout << "Success creating/connecting socket" << endl;
return true; //Success
}
}
//CLOSECONNECTION – shuts down the socket and closes any connection on it
void closeConnection()
{
//Close the socket if it exists
if (s)
closesocket(s);
WSACleanup(); //Clean up Winsock
}
Display More