Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenrecv.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS WinSock 2 API 00004 * FILE: recv.c 00005 * PURPOSE: Socket Receive Support 00006 * PROGRAMMER: Alex Ionescu (alex@relsoft.net) 00007 */ 00008 00009 /* INCLUDES ******************************************************************/ 00010 #include "ws2_32.h" 00011 00012 //#define NDEBUG 00013 #include <debug.h> 00014 00015 /* DATA **********************************************************************/ 00016 00017 /* FUNCTIONS *****************************************************************/ 00018 00019 /* 00020 * @implemented 00021 */ 00022 INT 00023 WSAAPI 00024 recv(IN SOCKET s, 00025 OUT CHAR FAR* buf, 00026 IN INT len, 00027 IN INT flags) 00028 { 00029 PWSSOCKET Socket; 00030 INT Status; 00031 INT ErrorCode; 00032 LPWSATHREADID ThreadId; 00033 WSABUF Buffers; 00034 DWORD BytesReceived; 00035 DPRINT("recv: %lx, %lx, %lx, %p\n", s, flags, len, buf); 00036 00037 /* Check for WSAStartup */ 00038 if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS) 00039 { 00040 /* Get the Socket Context */ 00041 if ((Socket = WsSockGetSocket(s))) 00042 { 00043 /* Setup the buffers */ 00044 Buffers.buf = buf; 00045 Buffers.len = len; 00046 00047 /* Make the call */ 00048 Status = Socket->Provider->Service.lpWSPRecv(s, 00049 &Buffers, 00050 1, 00051 &BytesReceived, 00052 (LPDWORD)&flags, 00053 NULL, 00054 NULL, 00055 ThreadId, 00056 &ErrorCode); 00057 /* Deference the Socket Context */ 00058 WsSockDereference(Socket); 00059 00060 /* Return Provider Value */ 00061 if (Status == ERROR_SUCCESS) 00062 { 00063 /* Handle OOB */ 00064 if (!(flags & MSG_PARTIAL)) return BytesReceived; 00065 ErrorCode = WSAEMSGSIZE; 00066 } 00067 00068 /* If everything seemed fine, then the WSP call failed itself */ 00069 if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE; 00070 } 00071 else 00072 { 00073 /* No Socket Context Found */ 00074 ErrorCode = WSAENOTSOCK; 00075 } 00076 } 00077 00078 /* Return with an Error */ 00079 SetLastError(ErrorCode); 00080 return SOCKET_ERROR; 00081 } 00082 00083 /* 00084 * @implemented 00085 */ 00086 INT 00087 WSAAPI 00088 recvfrom(IN SOCKET s, 00089 OUT CHAR FAR* buf, 00090 IN INT len, 00091 IN INT flags, 00092 OUT LPSOCKADDR from, 00093 IN OUT INT FAR* fromlen) 00094 { 00095 PWSSOCKET Socket; 00096 INT Status; 00097 INT ErrorCode; 00098 LPWSATHREADID ThreadId; 00099 WSABUF Buffers; 00100 DWORD BytesReceived; 00101 DPRINT("recvfrom: %lx, %lx, %lx, %p\n", s, flags, len, buf); 00102 00103 /* Check for WSAStartup */ 00104 if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS) 00105 { 00106 /* Get the Socket Context */ 00107 if ((Socket = WsSockGetSocket(s))) 00108 { 00109 /* Setup the buffers */ 00110 Buffers.buf = buf; 00111 Buffers.len = len; 00112 00113 /* Make the call */ 00114 Status = Socket->Provider->Service.lpWSPRecvFrom(s, 00115 &Buffers, 00116 1, 00117 &BytesReceived, 00118 (LPDWORD)&flags, 00119 from, 00120 fromlen, 00121 NULL, 00122 NULL, 00123 ThreadId, 00124 &ErrorCode); 00125 /* Deference the Socket Context */ 00126 WsSockDereference(Socket); 00127 00128 /* Return Provider Value */ 00129 if (Status == ERROR_SUCCESS) 00130 { 00131 /* Handle OOB */ 00132 if (!(flags & MSG_PARTIAL)) return BytesReceived; 00133 ErrorCode = WSAEMSGSIZE; 00134 } 00135 00136 /* If everything seemed fine, then the WSP call failed itself */ 00137 if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE; 00138 } 00139 else 00140 { 00141 /* No Socket Context Found */ 00142 ErrorCode = WSAENOTSOCK; 00143 } 00144 } 00145 00146 /* Return with an Error */ 00147 SetLastError(ErrorCode); 00148 return SOCKET_ERROR; 00149 } 00150 00151 /* 00152 * @implemented 00153 */ 00154 INT 00155 WSAAPI 00156 WSARecv(IN SOCKET s, 00157 IN OUT LPWSABUF lpBuffers, 00158 IN DWORD dwBufferCount, 00159 OUT LPDWORD lpNumberOfBytesRecvd, 00160 IN OUT LPDWORD lpFlags, 00161 IN LPWSAOVERLAPPED lpOverlapped, 00162 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) 00163 { 00164 PWSSOCKET Socket; 00165 INT Status; 00166 INT ErrorCode; 00167 LPWSATHREADID ThreadId; 00168 DPRINT("WSARecv: %lx, %lx, %lx, %p\n", s, lpFlags, dwBufferCount, lpBuffers); 00169 00170 /* Check for WSAStartup */ 00171 if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS) 00172 { 00173 /* Get the Socket Context */ 00174 if ((Socket = WsSockGetSocket(s))) 00175 { 00176 /* Make the call */ 00177 Status = Socket->Provider->Service.lpWSPRecv(s, 00178 lpBuffers, 00179 dwBufferCount, 00180 lpNumberOfBytesRecvd, 00181 lpFlags, 00182 lpOverlapped, 00183 lpCompletionRoutine, 00184 ThreadId, 00185 &ErrorCode); 00186 /* Deference the Socket Context */ 00187 WsSockDereference(Socket); 00188 00189 /* Return Provider Value */ 00190 if (Status == ERROR_SUCCESS) return Status; 00191 00192 /* If everything seemed fine, then the WSP call failed itself */ 00193 if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE; 00194 } 00195 else 00196 { 00197 /* No Socket Context Found */ 00198 ErrorCode = WSAENOTSOCK; 00199 } 00200 } 00201 00202 /* Return with an Error */ 00203 SetLastError(ErrorCode); 00204 return SOCKET_ERROR; 00205 } 00206 00207 /* 00208 * @implemented 00209 */ 00210 INT 00211 WSAAPI 00212 WSARecvDisconnect(IN SOCKET s, 00213 OUT LPWSABUF lpInboundDisconnectData) 00214 { 00215 PWSPROCESS Process; 00216 PWSTHREAD Thread; 00217 PWSSOCKET Socket; 00218 INT ErrorCode; 00219 INT Status; 00220 DPRINT("WSARecvDisconnect: %lx %p\n", s, lpInboundDisconnectData); 00221 00222 /* Enter prolog */ 00223 if ((ErrorCode = WsApiProlog(&Process, &Thread)) == ERROR_SUCCESS) 00224 { 00225 /* Get the Socket Context */ 00226 if ((Socket = WsSockGetSocket(s))) 00227 { 00228 /* Make the call */ 00229 Status = Socket->Provider->Service.lpWSPRecvDisconnect(s, 00230 lpInboundDisconnectData, 00231 &ErrorCode); 00232 /* Deference the Socket Context */ 00233 WsSockDereference(Socket); 00234 00235 /* Return Provider Value */ 00236 if (Status == ERROR_SUCCESS) return ERROR_SUCCESS; 00237 } 00238 else 00239 { 00240 /* No Socket Context Found */ 00241 ErrorCode = WSAENOTSOCK; 00242 } 00243 } 00244 00245 /* Return with an Error */ 00246 SetLastError(ErrorCode); 00247 return SOCKET_ERROR; 00248 } 00249 00250 /* 00251 * @implemented 00252 */ 00253 INT 00254 WSAAPI 00255 WSARecvFrom(IN SOCKET s, 00256 IN OUT LPWSABUF lpBuffers, 00257 IN DWORD dwBufferCount, 00258 OUT LPDWORD lpNumberOfBytesRecvd, 00259 IN OUT LPDWORD lpFlags, 00260 OUT LPSOCKADDR lpFrom, 00261 IN OUT LPINT lpFromlen, 00262 IN LPWSAOVERLAPPED lpOverlapped, 00263 IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine) 00264 { 00265 PWSSOCKET Socket; 00266 INT Status; 00267 INT ErrorCode; 00268 LPWSATHREADID ThreadId; 00269 DPRINT("WSARecvFrom: %lx, %lx, %lx, %p\n", s, lpFlags, dwBufferCount, lpBuffers); 00270 00271 /* Check for WSAStartup */ 00272 if ((ErrorCode = WsQuickPrologTid(&ThreadId)) == ERROR_SUCCESS) 00273 { 00274 /* Get the Socket Context */ 00275 if ((Socket = WsSockGetSocket(s))) 00276 { 00277 /* Make the call */ 00278 Status = Socket->Provider->Service.lpWSPRecvFrom(s, 00279 lpBuffers, 00280 dwBufferCount, 00281 lpNumberOfBytesRecvd, 00282 lpFlags, 00283 lpFrom, 00284 lpFromlen, 00285 lpOverlapped, 00286 lpCompletionRoutine, 00287 ThreadId, 00288 &ErrorCode); 00289 /* Deference the Socket Context */ 00290 WsSockDereference(Socket); 00291 00292 /* Return Provider Value */ 00293 if (Status == ERROR_SUCCESS) return Status; 00294 00295 /* If everything seemed fine, then the WSP call failed itself */ 00296 if (ErrorCode == NO_ERROR) ErrorCode = WSASYSCALLFAILURE; 00297 } 00298 else 00299 { 00300 /* No Socket Context Found */ 00301 ErrorCode = WSAENOTSOCK; 00302 } 00303 } 00304 00305 /* Return with an Error */ 00306 SetLastError(ErrorCode); 00307 return SOCKET_ERROR; 00308 } Generated on Sun May 27 2012 04:27:10 for ReactOS by
1.7.6.1
|