Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

Get the actual value from a socket connection

drios
Novice
639 Views

Hi everyone,

I'm working on a communication platform between Matlab and Fortran using ws2_32. I found a good working example in this link (https://software.intel.com/en-us/forums/intel-visual-fortran-compiler-for-windows/topic/291484) and i'm changing a few things to make it work with my matlab code.

So, i can communicate my matlab code (client) with my fortran code (server), but i don't know how to get the actual values on fortran. I just get the number of bytes received. I searched a lot on the internet without any helpful result. I mean, if i write a 'hello' string in matlab, for example, i want to be able to print the same string on fortran. Can anyone help me?

I'm new on fortran, so if you need a more detailed explanation, just tell me and i can even send you the fortran code (is not very different with respect to that one uploaded on the link above)

Thanks!

0 Kudos
1 Solution
drios
Novice
639 Views

Gib,

I'll take a look to onkelhotte's code, cause i was using as example lassytouton's code from the same thread (specifically this is the code, that i recommend as there is not too much information about sockets on fortran https://github.com/lassytouton/LittleDemos/tree/master/Intel%20Visual%20FORTRAN%20TCP%20IP%20Sockets%20Based%20Client%20Server from my research is the easiest to apply code i've found).

Anyway, to convert the character variables that i've sent from matlab into fortran to real variables, i've used:

bytesReceived = recv(connection,buffer,(size - bytesReceivedTotal),0)

READ(buffer,*)newDial !being buffer the variable i read, a character type variable, and newDial a real variable

And this should do the work, maybe in a simpler way with respecto to the inkelhotte's code

I attach here the *.f90 file i'm using to read variables from matlab. There are a few things related to the solution in the complex, as USE simulation_data that you should ignore. It's an easy to understand code to anyone searching for an example of fortran using winsock code.

For a more complete file (reading and writing example), again, i recommend the lassytouton's code i mentioned above.

Thanks for the replies and the help! I could say my doubts are vanished now.

View solution in original post

0 Kudos
5 Replies
gib
New Contributor II
639 Views

What does the send call on the Matlab side look like?  It would probably be easier to start by trying to send an integer, or integer array, rather than a string.

0 Kudos
drios
Novice
639 Views

Hey Gib,

For transmitting information from fortran to matlab, using the code on fortran, after stablishing the communication:

bytesSent = send(connection,buffer,(size - bytesSentTotal),0) ! Being 'buffer' the CHARACTER type variable to transmit.

And on matlab:

data=fread(t,t.bytesavailable); % Being the variable 't' the tcpip port stablished on matlab

I have realized that the variable 'data' receives the buffer data as ascii numbers. So with the use of the function char() on matlab i can change it into common characters. So that problem is solved.

For transmitting information from matlab to fortran, i'm using the code on matlab:

fwrite(t,str); % Being the variable 't' the tcpip port stablished on matlab, and str a char type variable

And on fortran:

bytesReceived = recv(connection,buffer,(size - bytesReceivedTotal),0) ! Being 'buffer', again, a CHARACTER type variable

Summarizing, i have realizied that just char type variables can be transmitted either way, and no integer nor real variables directly (this is my final objective). But making a post processing work on each program i think i can make this work done. Using on fortran the WRITE(charstr,*)realval and the READ(charstr,*)realval, and on matlab the char(); and str2num(); functions, i think i can be able to transform the variables at pleasure and then transmit them.

Any suggestion is obviously welcome.

Thanks for the response!

 

0 Kudos
gib
New Contributor II
639 Views

This site:

https://au.mathworks.com/help/matlab/ref/tcpclient.write.html

says that the 'write' command can send an array of any data type.  It is always sent as bytes (uint8) and the receiver determines how to interpret them.  From onkelhotte's code in the thread you referred to above, the function recv4 would be the one to use to transfer integers.  The sent bytes are assembled into an array of 4-byte integers.

Note: I haven't tested that code, I have only sent data via TCP/IP from Fortran to C++, and I don't work with Matlab.

0 Kudos
drios
Novice
640 Views

Gib,

I'll take a look to onkelhotte's code, cause i was using as example lassytouton's code from the same thread (specifically this is the code, that i recommend as there is not too much information about sockets on fortran https://github.com/lassytouton/LittleDemos/tree/master/Intel%20Visual%20FORTRAN%20TCP%20IP%20Sockets%20Based%20Client%20Server from my research is the easiest to apply code i've found).

Anyway, to convert the character variables that i've sent from matlab into fortran to real variables, i've used:

bytesReceived = recv(connection,buffer,(size - bytesReceivedTotal),0)

READ(buffer,*)newDial !being buffer the variable i read, a character type variable, and newDial a real variable

And this should do the work, maybe in a simpler way with respecto to the inkelhotte's code

I attach here the *.f90 file i'm using to read variables from matlab. There are a few things related to the solution in the complex, as USE simulation_data that you should ignore. It's an easy to understand code to anyone searching for an example of fortran using winsock code.

For a more complete file (reading and writing example), again, i recommend the lassytouton's code i mentioned above.

Thanks for the replies and the help! I could say my doubts are vanished now.

0 Kudos
gib
New Contributor II
640 Views

In fact the code to receive integers or reals is almost identical to that for receiving characters.  In any case you have something that works for you.  Well done!

0 Kudos
Reply