(git:3add494)
sockets_interface.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Implements UNIX and INET sockets
10 !> \par History
11 !> 08.2023 moved here and expanded for AS module by S. Battaglia
12 !> 03.2012 created by MC in ipi_driver.F
13 !> \author M. Ceriotti
14 ! **************************************************************************************************
15 
17 
18  USE iso_c_binding, ONLY: c_char,&
19  c_double,&
20  c_int,&
21  c_loc,&
22  c_ptr
23  USE kinds, ONLY: dp
24 #include "./base/base_uses.f90"
25 
26  IMPLICIT NONE
27  PRIVATE
28 
29  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'sockets_interface'
30 
31 #ifndef __NO_SOCKETS
35 
36  INTERFACE writebuffer
37  MODULE PROCEDURE writebuffer_s, &
38  writebuffer_d, writebuffer_dv, &
39  writebuffer_i
40 
41  END INTERFACE
42 
43  INTERFACE readbuffer
44  MODULE PROCEDURE readbuffer_s, &
45  readbuffer_dv, readbuffer_d, &
46  readbuffer_i
47 
48  END INTERFACE
49 
50  INTERFACE
51  SUBROUTINE uwait(sec) BIND(C, NAME="uwait")
52  USE iso_c_binding, ONLY: c_double
53  REAL(C_DOUBLE) :: sec
54 
55  END SUBROUTINE
56  END INTERFACE
57 
58  INTERFACE
59  SUBROUTINE open_connect_socket(psockfd, inet, port, host) BIND(C)
60  IMPORT
61  INTEGER(KIND=C_INT) :: psockfd, inet, port
62  CHARACTER(KIND=C_CHAR), DIMENSION(*) :: host
63 
64  END SUBROUTINE open_connect_socket
65 
66  SUBROUTINE open_bind_socket(psockfd, inet, port, host) BIND(C)
67  IMPORT
68  INTEGER(KIND=C_INT) :: psockfd, inet, port
69  CHARACTER(KIND=C_CHAR), DIMENSION(*) :: host
70 
71  END SUBROUTINE open_bind_socket
72 
73  SUBROUTINE listen_socket(psockfd, backlog) BIND(C)
74  IMPORT
75  INTEGER(KIND=C_INT) :: psockfd, backlog
76 
77  END SUBROUTINE listen_socket
78 
79  SUBROUTINE accept_socket(psockfd, pclientfd) BIND(C)
80  IMPORT
81  INTEGER(KIND=C_INT) :: psockfd, pclientfd
82 
83  END SUBROUTINE accept_socket
84 
85  SUBROUTINE close_socket(psockfd) BIND(C)
86  IMPORT
87  INTEGER(KIND=C_INT) :: psockfd
88 
89  END SUBROUTINE close_socket
90 
91  SUBROUTINE remove_socket_file(host) BIND(C)
92  IMPORT
93  CHARACTER(KIND=C_CHAR), DIMENSION(*) :: host
94 
95  END SUBROUTINE remove_socket_file
96 
97  SUBROUTINE writebuffer_csocket(psockfd, pdata, plen) BIND(C, name="writebuffer")
98  IMPORT
99  INTEGER(KIND=C_INT) :: psockfd
100  TYPE(C_PTR), VALUE :: pdata
101  INTEGER(KIND=C_INT) :: plen
102 
103  END SUBROUTINE writebuffer_csocket
104 
105  SUBROUTINE readbuffer_csocket(psockfd, pdata, plen) BIND(C, name="readbuffer")
106  IMPORT
107  INTEGER(KIND=C_INT) :: psockfd
108  TYPE(C_PTR), VALUE :: pdata
109  INTEGER(KIND=C_INT) :: plen
110 
111  END SUBROUTINE readbuffer_csocket
112  END INTERFACE
113 #endif
114 
115 CONTAINS
116 
117 #ifndef __NO_SOCKETS
118 ! **************************************************************************************************
119 !> \brief ...
120 !> \param psockfd ...
121 !> \param fdata ...
122 ! **************************************************************************************************
123  SUBROUTINE writebuffer_d(psockfd, fdata)
124  INTEGER, INTENT(IN) :: psockfd
125  REAL(KIND=dp), INTENT(IN) :: fdata
126 
127  CHARACTER(len=*), PARAMETER :: routineN = 'writebuffer_d'
128 
129  INTEGER :: handle
130  REAL(KIND=c_double), TARGET :: cdata
131 
132  CALL timeset(routinen, handle)
133 
134  cdata = fdata
135  CALL writebuffer_csocket(psockfd, c_loc(cdata), 8)
136 
137  CALL timestop(handle)
138  END SUBROUTINE
139 
140 ! **************************************************************************************************
141 !> \brief ...
142 !> \param psockfd ...
143 !> \param fdata ...
144 ! **************************************************************************************************
145  SUBROUTINE writebuffer_i(psockfd, fdata)
146  INTEGER, INTENT(IN) :: psockfd, fdata
147 
148  CHARACTER(len=*), PARAMETER :: routineN = 'writebuffer_i'
149 
150  INTEGER :: handle
151  INTEGER(KIND=C_INT), TARGET :: cdata
152 
153  CALL timeset(routinen, handle)
154 
155  cdata = fdata
156  CALL writebuffer_csocket(psockfd, c_loc(cdata), 4)
157 
158  CALL timestop(handle)
159  END SUBROUTINE
160 
161 ! **************************************************************************************************
162 !> \brief ...
163 !> \param psockfd ...
164 !> \param fstring ...
165 !> \param plen ...
166 ! **************************************************************************************************
167  SUBROUTINE writebuffer_s(psockfd, fstring, plen)
168  INTEGER, INTENT(IN) :: psockfd
169  CHARACTER(LEN=*), INTENT(IN) :: fstring
170  INTEGER, INTENT(IN) :: plen
171 
172  CHARACTER(len=*), PARAMETER :: routineN = 'writebuffer_s'
173 
174  INTEGER :: handle, i
175  CHARACTER(LEN=1, KIND=C_CHAR), TARGET :: cstring(plen)
176 
177  CALL timeset(routinen, handle)
178 
179  DO i = 1, plen
180  cstring(i) = fstring(i:i)
181  END DO
182  CALL writebuffer_csocket(psockfd, c_loc(cstring(1)), plen)
183 
184  CALL timestop(handle)
185 
186  END SUBROUTINE
187 
188 ! **************************************************************************************************
189 !> \brief ...
190 !> \param psockfd ...
191 !> \param fdata ...
192 !> \param plen ...
193 ! **************************************************************************************************
194  SUBROUTINE writebuffer_dv(psockfd, fdata, plen)
195  INTEGER, INTENT(IN) :: psockfd, plen
196  REAL(KIND=dp), INTENT(IN), TARGET :: fdata(plen)
197 
198  CHARACTER(len=*), PARAMETER :: routineN = 'writebuffer_dv'
199 
200  INTEGER :: handle
201 
202  CALL timeset(routinen, handle)
203 
204  CALL writebuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
205 
206  CALL timestop(handle)
207  END SUBROUTINE
208 
209 ! **************************************************************************************************
210 !> \brief ...
211 !> \param psockfd ...
212 !> \param fdata ...
213 ! **************************************************************************************************
214  SUBROUTINE readbuffer_d(psockfd, fdata)
215  INTEGER, INTENT(IN) :: psockfd
216  REAL(KIND=dp), INTENT(OUT) :: fdata
217 
218  CHARACTER(len=*), PARAMETER :: routineN = 'readbuffer_d'
219 
220  INTEGER :: handle
221  REAL(KIND=c_double), TARGET :: cdata
222 
223  CALL timeset(routinen, handle)
224 
225  CALL readbuffer_csocket(psockfd, c_loc(cdata), 8)
226  fdata = cdata
227 
228  CALL timestop(handle)
229  END SUBROUTINE
230 
231 ! **************************************************************************************************
232 !> \brief ...
233 !> \param psockfd ...
234 !> \param fdata ...
235 ! **************************************************************************************************
236  SUBROUTINE readbuffer_i(psockfd, fdata)
237  INTEGER, INTENT(IN) :: psockfd
238  INTEGER, INTENT(OUT) :: fdata
239 
240  CHARACTER(len=*), PARAMETER :: routineN = 'readbuffer_i'
241 
242  INTEGER :: handle
243  INTEGER(KIND=C_INT), TARGET :: cdata
244 
245  CALL timeset(routinen, handle)
246 
247  CALL readbuffer_csocket(psockfd, c_loc(cdata), 4)
248  fdata = cdata
249 
250  CALL timestop(handle)
251  END SUBROUTINE
252 
253 ! **************************************************************************************************
254 !> \brief ...
255 !> \param psockfd ...
256 !> \param fstring ...
257 !> \param plen ...
258 ! **************************************************************************************************
259  SUBROUTINE readbuffer_s(psockfd, fstring, plen)
260  INTEGER, INTENT(IN) :: psockfd
261  CHARACTER(LEN=*), INTENT(OUT) :: fstring
262  INTEGER, INTENT(IN) :: plen
263 
264  CHARACTER(len=*), PARAMETER :: routineN = 'readbuffer_s'
265 
266  INTEGER :: handle, i
267  CHARACTER(LEN=1, KIND=C_CHAR), TARGET :: cstring(plen)
268 
269  CALL timeset(routinen, handle)
270 
271  CALL readbuffer_csocket(psockfd, c_loc(cstring(1)), plen)
272  fstring = ""
273  DO i = 1, plen
274  fstring(i:i) = cstring(i)
275  END DO
276 
277  CALL timestop(handle)
278 
279  END SUBROUTINE
280 
281 ! **************************************************************************************************
282 !> \brief ...
283 !> \param psockfd ...
284 !> \param fdata ...
285 !> \param plen ...
286 ! **************************************************************************************************
287  SUBROUTINE readbuffer_dv(psockfd, fdata, plen)
288  INTEGER, INTENT(IN) :: psockfd, plen
289  REAL(KIND=dp), INTENT(OUT), TARGET :: fdata(plen)
290 
291  CHARACTER(len=*), PARAMETER :: routineN = 'readbuffer_dv'
292 
293  INTEGER :: handle
294 
295  CALL timeset(routinen, handle)
296 
297  CALL readbuffer_csocket(psockfd, c_loc(fdata(1)), 8*plen)
298 
299  CALL timestop(handle)
300 
301  END SUBROUTINE
302 #endif
303 
304 END MODULE sockets_interface
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Implements UNIX and INET sockets.
void open_bind_socket(int *psockfd, int *inet, int *port, char *host)
Opens and binds a socket.
Definition: sockets.c:137
void writebuffer(int *psockfd, char *data, int *plen)
Writes to a socket.
Definition: sockets.c:201
void accept_socket(int *psockfd, int *pclientfd)
Listens to a socket.
Definition: sockets.c:256
void uwait(double *dsec)
Mini-wrapper to nanosleep.
Definition: sockets.c:279
void close_socket(int *psockfd)
Closes a socket.
Definition: sockets.c:267
void listen_socket(int *psockfd, int *backlog)
Listens to a socket.
Definition: sockets.c:243
void readbuffer(int *psockfd, char *data, int *plen)
Reads from a socket.
Definition: sockets.c:219
void remove_socket_file(char *host)
Removes a socket file.
Definition: sockets.c:273