免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1471 | 回复: 3
打印 上一主题 下一主题

VC,网络编成。线程的问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-14 10:53 |只看该作者 |倒序浏览
头文件:
// NetClient.h: interface for the CNetClient class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_NETCLIENT_H__9B200D98_2A83_4465_BB6E_66B32EA8E2F6__INCLUDED_)
#define AFX_NETCLIENT_H__9B200D98_2A83_4465_BB6E_66B32EA8E2F6__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")

#define WM_READDATA WM_USER+1001

const int MAX_RECEIVE_LEN = 5120;
const int NORMAL_RECEIVE_LEN = 512;
const int SEND_LEN = 512;
const int ERR_LEN = 256;

class CNetClient  
{
public:
        //CNetClient( char *servip, int servport, int itimeout );
        CNetClient( CString servip, int servport, long itimeout );
        virtual ~CNetClient();
        inline void SethWnd( HWND hwnd )
        {
                m_hWnd = hwnd;
        }

        bool  InitNetClient();
        bool ConnectToServer();
        bool SendDataToServer( char* data, int len );
        char* GetLastError();

        static DWORD WINAPI ThreadToRead( LPVOID n );
        static DWORD WINAPI ThreadToSend( LPVOID n );
        void SetSendData( CString data );

        char* GetRcvData();

        //char        getData[MAX_RECEIVE_LEN];

private:
        char        servIp[16];
        //CString        servIp;
        int                servPort;
        char        szError[ERR_LEN];
        char        getData[MAX_RECEIVE_LEN];
        char        sendData[SEND_LEN];
        int                iRecv;
        int                iSend;
        long                nTimeout;

        SOCKET        servSocket;
        SOCKADDR_IN destination;
        PHOSTENT pHostent;

        WSADATA        wsData;
        HANDLE        hreadthread1;
        HANDLE        hreadthread2;
        HWND        m_hWnd;
        DWORD   dwThreadId;

       
};

cpp文件:
// NetClient.cpp: implementation of the CNetClient class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "znetbarsvr.h"
#include "NetClient.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CNetClient::CNetClient( CString servip, int servport, long itimeout )
{
        servSocket        = INVALID_SOCKET;
        pHostent        = NULL;
        strcpy( servIp, servip );       
        servPort        = servport;
        //hreadthread = NULL;
        dwThreadId        = NULL;
        iRecv        = 0;
        iSend        = 0;
        nTimeout = itimeout;
}

CNetClient::~CNetClient()
{
         DWORD exitCode=0;
         //if( hreadthread != NULL )
         //{
        //          GetExitCodeThread( hreadthread, &exitCode );
        //          ExitThread( exitCode );
         //}
         if( servSocket != INVALID_SOCKET )
         {
                 closesocket( servSocket );
         }
         WSACleanup();
}

// 初始化客户端
bool CNetClient::InitNetClient()
{
         if(WSAStartup(MAKEWORD(1,1),&this->wsData) != 0)
         {
                 wsprintf(this->szError,TEXT("socket failed.Error:%d"),WSAGetLastError ());
                 return false;
         }

         if( (servSocket = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET )
         {
                 wsprintf(this->szError,TEXT("socket failed.Error:%d"),WSAGetLastError ());
                 return false;
         }

         // 发送和接收时限设置
         //int nNetTimeout=2000;//20秒
         //发送时限
         setsockopt(servSocket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nTimeout,sizeof(int));
         //接收时限
         setsockopt(servSocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nTimeout,sizeof(int));


         destination.sin_family = AF_INET;
         destination.sin_addr.s_addr = inet_addr( servIp );
         destination.sin_port = htons( servPort );


         return true;
}

// 连接服务器
bool CNetClient::ConnectToServer()
{
        if(servSocket == INVALID_SOCKET)
                return false;
         if( connect( servSocket, (PSOCKADDR)&destination,  sizeof(destination) ) == SOCKET_ERROR )
         {
                  wsprintf(this->szError,TEXT("connect failed.Error:%d"),WSAGetLastError ());
                  closesocket(servSocket);
                  return false;
         }
         
         //memset( this->getData, 0, sizeof( this->getData ) );       
         hreadthread = CreateThread(NULL, 0, CNetClient::ThreadToRead, this, 0, &dwThreadId);
         MessageBox(NULL, (LPCTSTR)hreadthread, "create thread return", 0);
         closesocket(servSocket);
         if ( hreadthread != 0 )
                CloseHandle( hreadthread );
         else
        {
                 wsprintf(this->szError,TEXT("create thread.Error:%d"),WSAGetLastError ());
                 MessageBox(NULL,(LPCTSTR)getData,"getdata",0);
                 //closesocket(servSocket);
                 return false;
         }

         return true;
}

// 发送数据
bool CNetClient::SendDataToServer( char* data,int len )
{
        if(servSocket == INVALID_SOCKET)
                return false;

        if(send(servSocket,data,len,0) == SOCKET_ERROR)
        {
                wsprintf(this->szError,TEXT("send failed.Error:%d"),WSAGetLastError ());
                closesocket(servSocket);
                return false;
        }

        return true;
}

// 设置发送消息
void CNetClient::SetSendData( CString data )
{
        strcpy( sendData, data );
}

// 返回错误信息
char* CNetClient::GetLastError()
{
        return this->szError;
}

// 取得接收消息
char* CNetClient::GetRcvData()
{
        return getData;
}
// 读取数据的线程
DWORD WINAPI CNetClient::ThreadToRead(LPVOID n)
{
        CNetClient* pnetClient = (CNetClient*)n;
        DWORD dRtn = 0;

        pnetClient->iSend = send(pnetClient->servSocket,pnetClient->sendData,sizeof(pnetClient->sendData),0);
        if( pnetClient->iSend == SOCKET_ERROR )
        {
                wsprintf(pnetClient->szError,TEXT("send failed.Error:%d"),WSAGetLastError());
                closesocket(pnetClient->servSocket);
                return -1;
        }

        pnetClient->getData[MAX_RECEIVE_LEN] ='\0';
        pnetClient->iRecv = recv(pnetClient->servSocket,pnetClient->getData,sizeof(pnetClient->getData),0);
        if( pnetClient->iRecv == SOCKET_ERROR)
        {
                wsprintf(pnetClient->szError,TEXT("recv failed.Error:%d"),WSAGetLastError());
                closesocket(pnetClient->servSocket);
                return -2;
        }
        else if( pnetClient->iRecv == 0)
        {
                wsprintf(pnetClient->szError,TEXT("Finished receiving data"));
        }
                 
        return 0;
}

问题:发送信息到服务端。然后服务端返回信息后
接收BUFFER,即getdate第二次以后总是为空。

请哪位大侠指点一下。

论坛徽章:
0
2 [报告]
发表于 2006-03-15 10:13 |只看该作者
自己顶!

论坛徽章:
0
3 [报告]
发表于 2006-03-15 10:39 |只看该作者
vc??

论坛徽章:
0
4 [报告]
发表于 2006-03-16 11:21 |只看该作者
是的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP