Changeset 9841


Ignore:
Timestamp:
Feb 24, 2003, 11:03:58 AM (22 years ago)
Author:
sandervl
Message:

Implemented non-overlapped WSARecv & WSASend.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/ws2_32/socket.cpp

    r9836 r9841  
    1 /* $Id: socket.cpp,v 1.14 2003-02-22 10:05:41 sandervl Exp $ */
     1/* $Id: socket.cpp,v 1.15 2003-02-24 10:03:58 sandervl Exp $ */
    22/*
    33 * based on Windows Sockets 1.1 specs
     
    186186                    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine )
    187187{
     188    DWORD dwBytesSent, tmpret;
     189    DWORD ret = NO_ERROR;
     190
     191    dprintf(("WSASend %d %x %d %x %x %x %x", s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags, lpOverlapped, lpCompletionRoutine));
     192
     193    if(lpBuffers == NULL) {
     194        WSASetLastError(WSAEINVAL);
     195        return SOCKET_ERROR;
     196    }
     197    if(lpNumberOfBytesSent == NULL) {
     198        lpNumberOfBytesSent = &dwBytesSent;
     199    }
     200    if(!lpOverlapped && !lpCompletionRoutine)
     201    {
     202        *lpNumberOfBytesSent = 0;
     203
     204        for(int i=0;i<dwBufferCount;i++) {
     205            tmpret = send(s, lpBuffers[i].buf, lpBuffers[i].len,  dwFlags);
     206            if(tmpret != SOCKET_ERROR) {
     207                *lpNumberOfBytesSent += ret;
     208            }
     209            else {
     210                ret = SOCKET_ERROR;
     211                break;
     212            }
     213        }
     214        return ret;
     215    }
    188216    return WSASendTo ( s, lpBuffers, dwBufferCount, lpNumberOfBytesSent, dwFlags,
    189217                       NULL, 0, lpOverlapped, lpCompletionRoutine );
     
    205233 */
    206234int WINAPI WSARecv (SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
    207                     LPDWORD NumberOfBytesReceived, LPDWORD lpFlags,
     235                    LPDWORD lpNumberOfBytesReceived, LPDWORD lpFlags,
    208236                    LPWSAOVERLAPPED lpOverlapped,
    209237                    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
    210238{
    211     return WSARecvFrom (s, lpBuffers, dwBufferCount, NumberOfBytesReceived, lpFlags,
     239    DWORD dwBytesReceived, tmpret, flags;
     240    DWORD ret = NO_ERROR;
     241
     242    dprintf(("WSARecv %d %x %d %x %x %x %x", s, lpBuffers, dwBufferCount, lpNumberOfBytesReceived, lpFlags, lpOverlapped, lpCompletionRoutine));
     243    if(lpBuffers == NULL) {
     244        WSASetLastError(WSAEINVAL);
     245        return SOCKET_ERROR;
     246    }
     247    if(lpNumberOfBytesReceived == NULL) {
     248        lpNumberOfBytesReceived = &dwBytesReceived;
     249    }
     250    if(lpFlags == NULL) {
     251        lpFlags = &flags;
     252        flags = 0;
     253    }
     254    if(!lpOverlapped && !lpCompletionRoutine)
     255    {
     256        *lpNumberOfBytesReceived = 0;
     257
     258        for(int i=0;i<dwBufferCount;i++) {
     259            tmpret = recv(s, lpBuffers[i].buf, lpBuffers[i].len,  *lpFlags);
     260            if(tmpret != SOCKET_ERROR) {
     261                *lpNumberOfBytesReceived += ret;
     262            }
     263            else {
     264                ret = SOCKET_ERROR;
     265                break;
     266            }
     267        }
     268        *lpFlags = 0; //what to do with this?
     269        return ret;
     270    }
     271    return WSARecvFrom (s, lpBuffers, dwBufferCount, lpNumberOfBytesReceived, lpFlags,
    212272                        NULL, NULL, lpOverlapped, lpCompletionRoutine);
    213273}
Note: See TracChangeset for help on using the changeset viewer.