哪位高手可以提供多线程的winsock通讯服务器端的例程多谢。 我有一个例子,但不是API,而是类实现的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 最好是api的,因为我要想用nt service实现。用类实现的也可以,能发给我一份吗?多谢。 最近我也在看winsock的书,不过例子为单线程的,请您也发给我一份吧!多谢。 delphi的要不要,完全api的;也可以参考<<Windows网络编程>>(Network programing for MicroSoft windows)一书 的Winsock部分,有现成历程(多线程,略做改动即可) 以前我向别人发过一个nt service多线程Socket例子,你怎摸又问这个问题,我发一个给你 hjcao_wei:可以给我也发一个吗?[email protected] 我也要。。谢谢。。 [email protected] 这个例子教简单,大家看看。可一定要多给点分哦!/// 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 textTCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text//----------------------------------------------------------------------// Global data//const TCHAR szAppName[] = TEXT ("rizhao_server");HINSTANCE hInst; // Program instance handleHWND MainhWnd;BOOL fFirst = TRUE;HWND hwndMessageList;HWND hwndStartButton;int iFlagStart=0; //re start button, 0 means Start and 1 means StopSOCKET WinSocket = INVALID_SOCKET, // Window socket ClientSock = INVALID_SOCKET; // Socket for communicating // between the server and clientHANDLE 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;} 这个例子教简单,大家看看。可一定要多给点分哦!/// 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 textTCHAR szWindowClass[MAX_LOADSTRING]; // The title bar text//----------------------------------------------------------------------// Global data//const TCHAR szAppName[] = TEXT ("rizhao_server");HINSTANCE hInst; // Program instance handleHWND MainhWnd;BOOL fFirst = TRUE;HWND hwndMessageList;HWND hwndStartButton;int iFlagStart=0; //re start button, 0 means Start and 1 means StopSOCKET WinSocket = INVALID_SOCKET, // Window socket ClientSock = INVALID_SOCKET; // Socket for communicating // between the server and clientHANDLE 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;} 请教一个浅显的问题,究竟什么是单播呀? 新手愚问:怎么显示我的图片, 一个对菜鸟而言 关于文件使用的大问题 请各位大虾指点迷津, 在这我先谢了 在vc console程序里面怎么FTP 求最长路径的算法 问题简单我不会!高手快来帮我. 怎样知道本机用户用IE上了哪些网站???急 怎么读主板系列号? 高分求购:大小写转换程序 回家了!!! 请问 CJ60LIB和InstallShield是什么?谢谢拉 oicq的技术核心是什么?
也可以参考<<Windows网络编程>>(Network programing for MicroSoft windows)一书 的Winsock部分,有现成历程(多线程,略做改动即可)
/// 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;
}
/// 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;
}