sockets.pp 8.4 KB

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