我有一个例子,但不是API,而是类实现的。

解决方案 »

  1.   

    最好是api的,因为我要想用nt service实现。用类实现的也可以,能发给我一份吗?多谢。
      

  2.   

    最近我也在看winsock的书,不过例子为单线程的,请您也发给我一份吧!多谢。
      

  3.   

    delphi的要不要,完全api的;
    也可以参考<<Windows网络编程>>(Network programing for MicroSoft windows)一书 的Winsock部分,有现成历程(多线程,略做改动即可)
      

  4.   

    以前我向别人发过一个nt service多线程Socket例子,你怎摸又问这个问题,我发一个给你
      

  5.   

    hjcao_wei:可以给我也发一个吗?[email protected]
      

  6.   

    我也要。。谢谢。。 [email protected]
      

  7.   

    这个例子教简单,大家看看。可一定要多给点分哦!
    /// rizhao_server.cpp : Defines the entry point for the application.
    //#include "stdafx.h"
    #include "resource.h"
    #include <winsock.h>
    //#include <winnetwk.h>                // Network includes
    #include "rizhao_server.h" //wqy
    #define PORTNUM               5000    // Port number  
    #define MAX_PENDING_CONNECTS  4       // Maximum length of the queue 
                                          // of pending connections
    #define SINADDRB1             192
    #define SINADDRB2             168
    #define SINADDRB3             10
    #define SINADDRB4             10#define MAX_LOADSTRING 100// Global Variables:
    TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text//----------------------------------------------------------------------
    // Global data
    //
    const TCHAR szAppName[] = TEXT ("rizhao_server");
    HINSTANCE hInst;                     // Program instance handle
    HWND MainhWnd;
    BOOL fFirst = TRUE;
    HWND hwndMessageList;
    HWND hwndStartButton;
    int iFlagStart=0;            //re start button, 0 means Start and 1 means Stop
    SOCKET WinSocket = INVALID_SOCKET,  // Window socket
           ClientSock = INVALID_SOCKET; // Socket for communicating 
                                       // between the server and client
    HANDLE hThread,hThread1;// Command Message dispatch for MainWindowProc定义消息队列
    const struct decodeCMD MainCommandItems[] = {
        IDOK, DoMainCommandExit,
        IDCANCEL, DoMainCommandExit,
        IDD_START, DoMainCommandStart,
    };// Foward declarations of functions included in this code module:
    //ATOM MyRegisterClass(HINSTANCE hInstance);
    //BOOL InitInstance(HINSTANCE, int);
    //LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    //LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);//====================================
    //Program entry point
    //====================================
    int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    //Save program instance handle in global varible
    hInst=hInstance;  //Create main window
    DialogBox(hInst,szAppName,NULL,MainWndProc);
        return 0;
    }
    //===========================================
    //Message handling procedures for main window
    //--------------------------------------------
    //MainWndPro-Callback function for application
    //
    BOOL CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,
      LPARAM lParam)
    {
    MainhWnd = hWnd;
    hwndMessageList=GetDlgItem(hWnd,IDD_NETLIST);
    hwndStartButton=GetDlgItem(hWnd,IDD_START); int i;
    switch(wMsg)
    {
    case WM_INITDIALOG:
    i=75;
    //send a message to stop tab key
    SendDlgItemMessage(hWnd,IDD_NETLIST,LB_SETTABSTOPS,
    1,(LPARAM)&i);
            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Initialize successful!"));
    //RefreshLocalNetDrives(hWnd);
    break;    case WM_COMMAND:
        return DoCommandMain (hWnd, wMsg, wParam, lParam);
        }
        return FALSE;}//----------------------------------------------------------------------
    // DoCommandMain - Process WM_COMMAND message for window.
    //
    BOOL DoCommandMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
    {
        WORD idItem, wNotifyCode;
        HWND hwndCtl;
        INT  i;    // Parse the parameters.
        idItem = (WORD) LOWORD (wParam);
        wNotifyCode = (WORD) HIWORD (wParam);
        hwndCtl = (HWND) lParam;    // Call routine to handle control message.
    //command message
        for (i = 0; i < dim(MainCommandItems); i++) {
            if (idItem == MainCommandItems[i].Code) {
                (*MainCommandItems[i].Fxn)(hWnd, idItem, hwndCtl, 
                                           wNotifyCode);
                return TRUE;
            }
        }
        return FALSE;
    }
    //======================================================================
    // Command handler routines
    //----------------------------------------------------------------------
    // DoMainCommandExit - Process Program Exit command
    //
    LPARAM DoMainCommandExit (HWND hWnd, WORD idItem, HWND hwndCtl, 
                              WORD wNotifyCode) 
    {
        if (MessageBox(hWnd,"This command will disconnect all remote client, really?","Warning",MB_YESNO)==IDYES)
    {
          EndDialog (hWnd, 0);
        }
    return 0;

    }
    //----------------------------------------------------------------------
    // DoMainCommandStart
    //
    LPARAM DoMainCommandStart (HWND hWnd, WORD idItem, HWND hwndCtl, 
                                  WORD wNotifyCode)
    {
    DWORD rc;
    if (iFlagStart==0)
    {
            iFlagStart=1;
        hThread = CreateThread(NULL,0,ListenThread,hWnd,0,&rc);
        //if (hThread)    CloseHandle(hThread);

            return 0;
    }
    else
    {
    if (iFlagStart==1)
    {
              iFlagStart=0;
              //if hThread,hThread1 still active, close them
      //if (GetExitCodeThread(hThread,lpExitCode)==STILL_ACTIVE)
          TerminateThread(hThread,0x15);
      //if (GetExitCodeThread(hThread1,lpExitCode)==STILL_ACTIVE)
          TerminateThread(hThread1,0x15);
              //if WinSocket,ClientSock still active, close them
      if (WinSocket != INVALID_SOCKET) 
                  closesocket (WinSocket);
      if (ClientSock != INVALID_SOCKET) 
                  closesocket (ClientSock);       SetDlgItemText(MainhWnd,IDD_START,TEXT("Start"));
              SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Server stoped."));
      return 0;
    }
    return 0;
    }}//===============================================================
    //
    DWORD WINAPI ListenThread(PVOID pArg)
    {
      //wqy
      DWORD rc1;
      int index = 0;                      // Integer index
    //  char szServerA[100];                // ASCII string 
    //  TCHAR szServerW[100];               // UNICODE string
      TCHAR szError[100];                 // Error message string
      SOCKADDR_IN local_sin,              // Local socket address
                  accept_sin;             // Receives the address of the 
                                          // connecting entity
      int accept_sin_len;                 // Length of accept_sin  WSADATA WSAData;                    // Contains details of the Windows
                                          // Sockets implementation  // Initiate Windows Sockets.
      if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
      {
        wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        return FALSE;
      }  // Create a TCP/IP socket, WinSocket.
      if ((WinSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
      {
        wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        return FALSE;
      }  // Fill out the local socket's address information.
      local_sin.sin_family = AF_INET;
      local_sin.sin_port = htons (PORTNUM);  
      local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
      //local_sin.sin_addr.S_un.S_un_b.s_b1=SINADDRB1;
      //local_sin.sin_addr.S_un.S_un_b.s_b2=SINADDRB2;
      //local_sin.sin_addr.S_un.S_un_b.s_b3=SINADDRB3;
      //local_sin.sin_addr.S_un.S_un_b.s_b4=SINADDRB4;
      // Associate the local address with WinSocket.
      if (bind (WinSocket, 
                (struct sockaddr *) &local_sin, 
                sizeof (local_sin)) == SOCKET_ERROR) 
      {
        wsprintf (szError, TEXT("Port already used! Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        closesocket (WinSocket);
        return FALSE;
      }  // Establish a socket to listen for incoming connections.
      if (listen (WinSocket, MAX_PENDING_CONNECTS) == SOCKET_ERROR) 
      {
        wsprintf (szError,
                  TEXT("Listening to the client failed. Error: %d"),
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        //closesocket (WinSocket);
        return FALSE;
      }
      //wqy
      SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Server started. Listening..."));  //disable the start button.
      SetDlgItemText(MainhWnd,IDD_START,TEXT("Stop"));
      accept_sin_len = sizeof (accept_sin);  // Accept an incoming connection attempt on WinSocket.
      //accept returns a new handle which used to communicate with client.
      //accept is a block function. It is not return until there is a client request.
      while (1)
      {
          ClientSock = accept (WinSocket, 
                              (struct sockaddr *) &accept_sin, 
                              (int *) &accept_sin_len);      if (ClientSock != INVALID_SOCKET) 
      {
              //create thread, function is SenderThread and parameter is ClientSock
              hThread1=CreateThread(NULL,0,SenderThread,(PVOID)ClientSock,0,&rc1);
              //block until hThread1 returns
      WaitForSingleObject(hThread1,INFINITE);
      if(hThread1) CloseHandle(hThread1);
          // Close ClientSock.
              closesocket (ClientSock);
      
      }
      }  WSACleanup ();
      return TRUE;
    }//=============================================================
    DWORD WINAPI SenderThread(PVOID pArg)
    {
    SOCKET t_sock=(SOCKET)pArg;
    int nFileSize,rc,i,nSize=0;
    ULONG nCnt;
    TCHAR szFileName[MAX_PATH];
    char *szBuff;
    char *szTemp;
    char *szFlag; HANDLE hFile;    SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("A client request."));//begin change handshake message
    //first client send filename and server receive and save in string szFileName
    //read the number of bytes in the filename
        rc=recv(t_sock,szFileName,sizeof(szFileName),0); //if ((rc==SOCKET_ERROR)||(nCnt>MAX_PATH))
    if (rc==SOCKET_ERROR)
    {
            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Failed receiving name size."));
        closesocket(t_sock);
        return -1;
    }

        //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Received filename."));//then open file, calculate file size and send file size
    //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Opening file..."));
    hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    if (hFile==INVALID_HANDLE_VALUE)
    {
        SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("File opened failed."));
    rc=BAD_FILEOPEN;
    }
    else
    {
    rc=0;
    nFileSize=GetFileSize(hFile,NULL);
    //Allocate buffer and read file
    szBuff=(char *)LocalAlloc(LMEM_ZEROINIT,nFileSize);
    szTemp=(char *)LocalAlloc(LMEM_ZEROINIT,3000);
    szFlag=(char *)LocalAlloc(LMEM_ZEROINIT,strlen("OK!")+1);
    if(szBuff)
    {
    //read file,nCnt save the bytes read.
    ReadFile (hFile,szBuff,nFileSize,&nCnt,NULL);
    }    
    //Start transfer.First send size and get acknowledgment.
    //rc return the total bytes sent.
            //rc=send(t_sock,(char *)nFileSize,strlen(szBuff),0);
    rc=send(t_sock,(char *)&nFileSize,sizeof(nFileSize),0);
    //rc=send(t_sock,(PBYTE)&nFileSize,sizeof(nFileSize),0);
    if (rc==SOCKET_ERROR)
    {
             SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file size error."));
    rc=BAD_SOCKET;
    }else
         //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file size successful. Waiting reply..."));
            //receiving reply
    rc=recv(t_sock,szFlag,strlen("OK!")+1,0);
    if (rc==SOCKET_ERROR) return -1;        //handshake successful. Send file data.
            //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Received client reply. Sending file data... "));
            rc=send(t_sock,szBuff,nFileSize,0); rc=recv(t_sock,szFlag,strlen("OK!")+1,0);
    if (rc==SOCKET_ERROR)
    {
             SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file error."));
    rc=BAD_SOCKET;
        closesocket(t_sock);
            return -1;
    }

            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("File transfered successful!"));
            CloseHandle(hFile);
    LocalFree(szTemp);
    LocalFree(szBuff);
    LocalFree(szFlag);
    return 0;
        }
    return 0;
    }
      

  8.   

    这个例子教简单,大家看看。可一定要多给点分哦!
    /// rizhao_server.cpp : Defines the entry point for the application.
    //#include "stdafx.h"
    #include "resource.h"
    #include <winsock.h>
    //#include <winnetwk.h>                // Network includes
    #include "rizhao_server.h" //wqy
    #define PORTNUM               5000    // Port number  
    #define MAX_PENDING_CONNECTS  4       // Maximum length of the queue 
                                          // of pending connections
    #define SINADDRB1             192
    #define SINADDRB2             168
    #define SINADDRB3             10
    #define SINADDRB4             10#define MAX_LOADSTRING 100// Global Variables:
    TCHAR szTitle[MAX_LOADSTRING]; // The title bar text
    TCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text//----------------------------------------------------------------------
    // Global data
    //
    const TCHAR szAppName[] = TEXT ("rizhao_server");
    HINSTANCE hInst;                     // Program instance handle
    HWND MainhWnd;
    BOOL fFirst = TRUE;
    HWND hwndMessageList;
    HWND hwndStartButton;
    int iFlagStart=0;            //re start button, 0 means Start and 1 means Stop
    SOCKET WinSocket = INVALID_SOCKET,  // Window socket
           ClientSock = INVALID_SOCKET; // Socket for communicating 
                                       // between the server and client
    HANDLE hThread,hThread1;// Command Message dispatch for MainWindowProc定义消息队列
    const struct decodeCMD MainCommandItems[] = {
        IDOK, DoMainCommandExit,
        IDCANCEL, DoMainCommandExit,
        IDD_START, DoMainCommandStart,
    };// Foward declarations of functions included in this code module:
    //ATOM MyRegisterClass(HINSTANCE hInstance);
    //BOOL InitInstance(HINSTANCE, int);
    //LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    //LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);//====================================
    //Program entry point
    //====================================
    int WINAPI WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    //Save program instance handle in global varible
    hInst=hInstance;  //Create main window
    DialogBox(hInst,szAppName,NULL,MainWndProc);
        return 0;
    }
    //===========================================
    //Message handling procedures for main window
    //--------------------------------------------
    //MainWndPro-Callback function for application
    //
    BOOL CALLBACK MainWndProc(HWND hWnd,UINT wMsg,WPARAM wParam,
      LPARAM lParam)
    {
    MainhWnd = hWnd;
    hwndMessageList=GetDlgItem(hWnd,IDD_NETLIST);
    hwndStartButton=GetDlgItem(hWnd,IDD_START); int i;
    switch(wMsg)
    {
    case WM_INITDIALOG:
    i=75;
    //send a message to stop tab key
    SendDlgItemMessage(hWnd,IDD_NETLIST,LB_SETTABSTOPS,
    1,(LPARAM)&i);
            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Initialize successful!"));
    //RefreshLocalNetDrives(hWnd);
    break;    case WM_COMMAND:
        return DoCommandMain (hWnd, wMsg, wParam, lParam);
        }
        return FALSE;}//----------------------------------------------------------------------
    // DoCommandMain - Process WM_COMMAND message for window.
    //
    BOOL DoCommandMain (HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
    {
        WORD idItem, wNotifyCode;
        HWND hwndCtl;
        INT  i;    // Parse the parameters.
        idItem = (WORD) LOWORD (wParam);
        wNotifyCode = (WORD) HIWORD (wParam);
        hwndCtl = (HWND) lParam;    // Call routine to handle control message.
    //command message
        for (i = 0; i < dim(MainCommandItems); i++) {
            if (idItem == MainCommandItems[i].Code) {
                (*MainCommandItems[i].Fxn)(hWnd, idItem, hwndCtl, 
                                           wNotifyCode);
                return TRUE;
            }
        }
        return FALSE;
    }
    //======================================================================
    // Command handler routines
    //----------------------------------------------------------------------
    // DoMainCommandExit - Process Program Exit command
    //
    LPARAM DoMainCommandExit (HWND hWnd, WORD idItem, HWND hwndCtl, 
                              WORD wNotifyCode) 
    {
        if (MessageBox(hWnd,"This command will disconnect all remote client, really?","Warning",MB_YESNO)==IDYES)
    {
          EndDialog (hWnd, 0);
        }
    return 0;

    }
    //----------------------------------------------------------------------
    // DoMainCommandStart
    //
    LPARAM DoMainCommandStart (HWND hWnd, WORD idItem, HWND hwndCtl, 
                                  WORD wNotifyCode)
    {
    DWORD rc;
    if (iFlagStart==0)
    {
            iFlagStart=1;
        hThread = CreateThread(NULL,0,ListenThread,hWnd,0,&rc);
        //if (hThread)    CloseHandle(hThread);

            return 0;
    }
    else
    {
    if (iFlagStart==1)
    {
              iFlagStart=0;
              //if hThread,hThread1 still active, close them
      //if (GetExitCodeThread(hThread,lpExitCode)==STILL_ACTIVE)
          TerminateThread(hThread,0x15);
      //if (GetExitCodeThread(hThread1,lpExitCode)==STILL_ACTIVE)
          TerminateThread(hThread1,0x15);
              //if WinSocket,ClientSock still active, close them
      if (WinSocket != INVALID_SOCKET) 
                  closesocket (WinSocket);
      if (ClientSock != INVALID_SOCKET) 
                  closesocket (ClientSock);       SetDlgItemText(MainhWnd,IDD_START,TEXT("Start"));
              SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Server stoped."));
      return 0;
    }
    return 0;
    }}//===============================================================
    //
    DWORD WINAPI ListenThread(PVOID pArg)
    {
      //wqy
      DWORD rc1;
      int index = 0;                      // Integer index
    //  char szServerA[100];                // ASCII string 
    //  TCHAR szServerW[100];               // UNICODE string
      TCHAR szError[100];                 // Error message string
      SOCKADDR_IN local_sin,              // Local socket address
                  accept_sin;             // Receives the address of the 
                                          // connecting entity
      int accept_sin_len;                 // Length of accept_sin  WSADATA WSAData;                    // Contains details of the Windows
                                          // Sockets implementation  // Initiate Windows Sockets.
      if (WSAStartup (MAKEWORD(1,1), &WSAData) != 0) 
      {
        wsprintf (szError, TEXT("WSAStartup failed. Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        return FALSE;
      }  // Create a TCP/IP socket, WinSocket.
      if ((WinSocket = socket (AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) 
      {
        wsprintf (szError, TEXT("Allocating socket failed. Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        return FALSE;
      }  // Fill out the local socket's address information.
      local_sin.sin_family = AF_INET;
      local_sin.sin_port = htons (PORTNUM);  
      local_sin.sin_addr.s_addr = htonl (INADDR_ANY);
      //local_sin.sin_addr.S_un.S_un_b.s_b1=SINADDRB1;
      //local_sin.sin_addr.S_un.S_un_b.s_b2=SINADDRB2;
      //local_sin.sin_addr.S_un.S_un_b.s_b3=SINADDRB3;
      //local_sin.sin_addr.S_un.S_un_b.s_b4=SINADDRB4;
      // Associate the local address with WinSocket.
      if (bind (WinSocket, 
                (struct sockaddr *) &local_sin, 
                sizeof (local_sin)) == SOCKET_ERROR) 
      {
        wsprintf (szError, TEXT("Port already used! Error: %d"), 
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        closesocket (WinSocket);
        return FALSE;
      }  // Establish a socket to listen for incoming connections.
      if (listen (WinSocket, MAX_PENDING_CONNECTS) == SOCKET_ERROR) 
      {
        wsprintf (szError,
                  TEXT("Listening to the client failed. Error: %d"),
                  WSAGetLastError ());
        MessageBox (NULL, szError, TEXT("Error"), MB_OK);
        //closesocket (WinSocket);
        return FALSE;
      }
      //wqy
      SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Server started. Listening..."));  //disable the start button.
      SetDlgItemText(MainhWnd,IDD_START,TEXT("Stop"));
      accept_sin_len = sizeof (accept_sin);  // Accept an incoming connection attempt on WinSocket.
      //accept returns a new handle which used to communicate with client.
      //accept is a block function. It is not return until there is a client request.
      while (1)
      {
          ClientSock = accept (WinSocket, 
                              (struct sockaddr *) &accept_sin, 
                              (int *) &accept_sin_len);      if (ClientSock != INVALID_SOCKET) 
      {
              //create thread, function is SenderThread and parameter is ClientSock
              hThread1=CreateThread(NULL,0,SenderThread,(PVOID)ClientSock,0,&rc1);
              //block until hThread1 returns
      WaitForSingleObject(hThread1,INFINITE);
      if(hThread1) CloseHandle(hThread1);
          // Close ClientSock.
              closesocket (ClientSock);
      
      }
      }  WSACleanup ();
      return TRUE;
    }//=============================================================
    DWORD WINAPI SenderThread(PVOID pArg)
    {
    SOCKET t_sock=(SOCKET)pArg;
    int nFileSize,rc,i,nSize=0;
    ULONG nCnt;
    TCHAR szFileName[MAX_PATH];
    char *szBuff;
    char *szTemp;
    char *szFlag; HANDLE hFile;    SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("A client request."));//begin change handshake message
    //first client send filename and server receive and save in string szFileName
    //read the number of bytes in the filename
        rc=recv(t_sock,szFileName,sizeof(szFileName),0); //if ((rc==SOCKET_ERROR)||(nCnt>MAX_PATH))
    if (rc==SOCKET_ERROR)
    {
            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Failed receiving name size."));
        closesocket(t_sock);
        return -1;
    }

        //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Received filename."));//then open file, calculate file size and send file size
    //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Opening file..."));
    hFile=CreateFile(szFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
    if (hFile==INVALID_HANDLE_VALUE)
    {
        SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("File opened failed."));
    rc=BAD_FILEOPEN;
    }
    else
    {
    rc=0;
    nFileSize=GetFileSize(hFile,NULL);
    //Allocate buffer and read file
    szBuff=(char *)LocalAlloc(LMEM_ZEROINIT,nFileSize);
    szTemp=(char *)LocalAlloc(LMEM_ZEROINIT,3000);
    szFlag=(char *)LocalAlloc(LMEM_ZEROINIT,strlen("OK!")+1);
    if(szBuff)
    {
    //read file,nCnt save the bytes read.
    ReadFile (hFile,szBuff,nFileSize,&nCnt,NULL);
    }    
    //Start transfer.First send size and get acknowledgment.
    //rc return the total bytes sent.
            //rc=send(t_sock,(char *)nFileSize,strlen(szBuff),0);
    rc=send(t_sock,(char *)&nFileSize,sizeof(nFileSize),0);
    //rc=send(t_sock,(PBYTE)&nFileSize,sizeof(nFileSize),0);
    if (rc==SOCKET_ERROR)
    {
             SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file size error."));
    rc=BAD_SOCKET;
    }else
         //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file size successful. Waiting reply..."));
            //receiving reply
    rc=recv(t_sock,szFlag,strlen("OK!")+1,0);
    if (rc==SOCKET_ERROR) return -1;        //handshake successful. Send file data.
            //SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Received client reply. Sending file data... "));
            rc=send(t_sock,szBuff,nFileSize,0); rc=recv(t_sock,szFlag,strlen("OK!")+1,0);
    if (rc==SOCKET_ERROR)
    {
             SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("Send file error."));
    rc=BAD_SOCKET;
        closesocket(t_sock);
            return -1;
    }

            SendMessage(hwndMessageList,LB_ADDSTRING,0,(LPARAM)TEXT("File transfered successful!"));
            CloseHandle(hFile);
    LocalFree(szTemp);
    LocalFree(szBuff);
    LocalFree(szFlag);
    return 0;
        }
    return 0;
    }