sockets.pp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {$mode objfpc}
  11. unit Sockets;
  12. Interface
  13. {$macro on}
  14. {$define maybelibc:=}
  15. Uses
  16. winsock2,ctypes;
  17. Type
  18. size_t = cuint32;
  19. ssize_t = cint32;
  20. tsocklen= cint;
  21. psocklen= ^tsocklen;
  22. const EsockEINTR = WSAEINTR;
  23. EsockEBADF = WSAEBADF;
  24. EsockEFAULT = WSAEFAULT;
  25. EsockEINVAL = WSAEINVAL;
  26. {$i socketsh.inc}
  27. {$i fpwinsockh.inc}
  28. Implementation
  29. { Include filerec and textrec structures }
  30. {$i filerec.inc}
  31. {$i textrec.inc}
  32. {******************************************************************************
  33. Basic Socket Functions
  34. ******************************************************************************}
  35. //function fprecvmsg (s:cint; msg: pmsghdr; flags:cint):ssize_t;
  36. //function fpsendmsg (s:cint; hdr: pmsghdr; flags:cint):ssize;
  37. //function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  38. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  39. begin
  40. fpSocket:=WinSock2.Socket(Domain,xtype,ProtoCol);
  41. if fpSocket<0 then
  42. SocketError:=WSAGetLastError
  43. else
  44. SocketError:=0;
  45. end;
  46. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  47. begin
  48. fpSend:=WinSock2.Send(S,msg,len,flags);
  49. if fpSend<0 then
  50. SocketError:=WSAGetLastError
  51. else
  52. SocketError:=0;
  53. end;
  54. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  55. begin
  56. // Dubious construct, this should be checked. (IPV6 fails ?)
  57. fpSendTo:=WinSock2.SendTo(S,msg,Len,Flags,Winsock2.PSockAddr(tox),toLen);
  58. if fpSendTo<0 then
  59. SocketError:=WSAGetLastError
  60. else
  61. SocketError:=0;
  62. end;
  63. function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
  64. begin
  65. fpRecv:=WinSock2.Recv(S,Buf,Len,Flags);
  66. if fpRecv<0 then
  67. SocketError:=WSAGetLastError
  68. else
  69. SocketError:=0;
  70. end;
  71. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  72. begin
  73. fpRecvFrom:=WinSock2.RecvFrom(S,Buf,Len,Flags,WinSock2.PSockAddr(From),FromLen);
  74. if fpRecvFrom<0 then
  75. SocketError:=WSAGetLastError
  76. else
  77. SocketError:=0;
  78. end;
  79. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  80. begin
  81. fpConnect:=Winsock2.Connect(S,WinSock2.PSockAddr(name),nameLen);
  82. if fpConnect<0 then
  83. SocketError:=WSAGetLastError
  84. else
  85. SocketError:=0;
  86. end;
  87. function fpshutdown (s:cint; how:cint):cint;
  88. begin
  89. fpShutDown:=Winsock2.ShutDown(S,How);
  90. if fpShutDown<0 then
  91. SocketError:=WSAGetLastError
  92. else
  93. SocketError:=0;
  94. end;
  95. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  96. begin
  97. socket:=fpsocket(Domain,sockettype,protocol);
  98. end;
  99. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  100. begin
  101. send:=fpsend(sock,@buf,buflen,flags);
  102. end;
  103. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  104. begin
  105. sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
  106. end;
  107. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  108. begin
  109. Recv:=fpRecv(Sock,@Buf,BufLen,Flags);
  110. end;
  111. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longint) : longint;
  112. begin
  113. RecvFrom:=fpRecvFrom(Sock,@Buf,BufLen,Flags,@Addr,@AddrLen);
  114. end;
  115. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  116. begin
  117. fpbind:=Winsock2.Bind(S,Winsock2.PSockAddr(Addrx),AddrLen);
  118. if fpbind<0 then
  119. SocketError:=WSAGetLastError
  120. else
  121. SocketError:=0;
  122. end;
  123. function fplisten (s:cint; backlog : cint):cint;
  124. begin
  125. fplisten:=Winsock2.Listen(S,backlog);
  126. if fplisten<0 then
  127. SocketError:=WSAGetLastError
  128. else
  129. SocketError:=0;
  130. end;
  131. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  132. begin
  133. fpAccept:=Winsock2.Accept(S,Winsock2.PSockAddr(Addrx), AddrLen);
  134. if fpAccept<0 then
  135. SocketError:=WSAGetLastError
  136. else
  137. SocketError:=0;
  138. end;
  139. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  140. begin
  141. fpGetSockName:=Winsock2.GetSockName(S,Winsock2.TSockAddr(name^),nameLen^);
  142. if fpGetSockName<0 then
  143. SocketError:=WSAGetLastError
  144. else
  145. SocketError:=0;
  146. end;
  147. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  148. begin
  149. fpGetPeerName:=Winsock2.GetPeerName(S,Winsock2.TSockAddr(name^),NameLen^);
  150. if fpGetPeerName<0 then
  151. SocketError:=WSAGetLastError
  152. else
  153. SocketError:=0;
  154. end;
  155. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  156. begin
  157. fpGetSockOpt:=Winsock2.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
  158. if fpGetSockOpt<0 then
  159. SocketError:=WSAGetLastError
  160. else
  161. SocketError:=0;
  162. end;
  163. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
  164. begin
  165. fpSetSockOpt:=Winsock2.SetSockOpt(S,Level,OptName,OptVal,OptLen);
  166. if fpSetSockOpt<0 then
  167. SocketError:=WSAGetLastError
  168. else
  169. SocketError:=0;
  170. end;
  171. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  172. begin
  173. fpsocketpair:=-1;
  174. SocketError:=EOPNOTSUPP;
  175. end;
  176. Function CloseSocket(Sock:Longint):Longint;
  177. var i : longint;
  178. begin
  179. i := Winsock2.CloseSocket (Sock);
  180. if i <> 0 then
  181. begin
  182. SocketError:=WSAGetLastError;
  183. CloseSocket := i;
  184. end else
  185. begin
  186. CloseSocket := 0;
  187. SocketError := 0;
  188. end;
  189. end;
  190. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  191. begin
  192. bind:=fpBind(Sock,@Addr,AddrLen)=0;
  193. end;
  194. Function Listen(Sock,MaxConnect:Longint):Boolean;
  195. begin
  196. Listen:=fplisten(Sock,MaxConnect)=0;
  197. end;
  198. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  199. begin
  200. Accept:=FPAccept(sock,@addr,@addrlen);
  201. end;
  202. Function Shutdown(Sock:Longint;How:Longint):Longint;
  203. begin
  204. shutdown:=fpshutdown(sock,how);
  205. end;
  206. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
  207. begin
  208. connect:=fpconnect(sock,@addr,addrlen)=0;
  209. end;
  210. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  211. begin
  212. GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
  213. end;
  214. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  215. begin
  216. GetPeerName:=fpGetPeerName(Sock,@addr,@addrlen);
  217. end;
  218. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  219. begin
  220. GetSocketOptions:=fpGetSockOpt(sock,level,optname,@optval,@optlen);
  221. end;
  222. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  223. begin
  224. SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
  225. end;
  226. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  227. begin
  228. SocketPair:=fpsocketpair(domain,sockettype,protocol,@pair[1]);
  229. end;
  230. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  231. begin
  232. fpWrite := dword(Winsock2.send(handle, bufptr, size, 0));
  233. if fpWrite = dword(winsock2.SOCKET_ERROR) then
  234. begin
  235. SocketError := WSAGetLastError;
  236. fpWrite := 0;
  237. end
  238. else
  239. SocketError := 0;
  240. end;
  241. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  242. var
  243. d : dword;
  244. begin
  245. if ioctlsocket(handle,FIONREAD,@d) = winsock2.SOCKET_ERROR then
  246. begin
  247. SocketError:=WSAGetLastError;
  248. fpRead:=0;
  249. exit;
  250. end;
  251. if d>0 then
  252. begin
  253. if size>d then
  254. size:=d;
  255. fpRead := dword(Winsock2.recv(handle, bufptr, size, 0));
  256. if fpRead = dword(winsock2.SOCKET_ERROR) then
  257. begin
  258. SocketError:= WSAGetLastError;
  259. fpRead := 0;
  260. end else
  261. SocketError:=0;
  262. end
  263. else
  264. SocketError:=0;
  265. end;
  266. {$i sockets.inc}
  267. { Winsocket stack needs an init. and cleanup code }
  268. var
  269. wsadata : twsadata;
  270. initialization
  271. WSAStartUp($2,wsadata);
  272. finalization
  273. WSACleanUp;
  274. end.