tcp发送消息溢出!! [英] tcp send message Overflow!!

查看:97
本文介绍了tcp发送消息溢出!!的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是服务器

this is server

#pragma once
#include <WINSOCK2.H>  
#pragma comment(lib,"Ws2_32.lib")  

#define PORT 8001
#define IP "127.0.0.1"
#define SINGEL_SEND "single_send"

class CSock
{
private:
	SOCKET Sock_Server;
	SOCKET Sock_Client;
	WSADATA Wsa;
	SOCKADDR_IN AddrServer;
	SOCKADDR_IN AddrClient;
	int LenOfAddrClient ; 
	int sendTotal;
	int sendThisTime;
	char buff[20];
public:
	bool senddata(char * data , int nsize);
	bool sockini();
	void recvData( char *data , int nsize ) ;
	bool recvFlag();
	CSock(void);
	~CSock(void);
};




#include "Sock.h"



CSock::CSock(void)
{
}


CSock::~CSock(void)
{
	closesocket(Sock_Server);
	WSACleanup() ; 
}

bool CSock::senddata(char * data , int nsize)
{
	sendTotal = 0 ;
	sendThisTime = 0 ;
	while ( sendTotal < nsize )
	{
		sendThisTime = send( Sock_Client , data + sendTotal , nsize - sendTotal , 0  );
		sendTotal += sendThisTime ;
		if (sendThisTime < 0 )
		{
			return false;
		}
	}
	return true ;
}

void CSock::recvData( char *data , int nsize )
{
	sendTotal = 0 ;
	sendThisTime = 0 ;
	while ( sendTotal < nsize )
	{
		sendThisTime =  recv( Sock_Client , data+sendTotal , nsize - sendTotal , 0  );
		sendTotal += sendThisTime ;
	}
}

bool CSock::recvFlag()
{
	memset( (void*)buff , 0 , strlen( SINGEL_SEND ) );
	recvData( buff , strlen(SINGEL_SEND));
	if ( memcmp( (void*)buff , SINGEL_SEND , strlen(SINGEL_SEND) ) == 0 )
	{
		return true ;
	}
	return false ;
}

bool CSock::sockini()
{
	if (WSAStartup( MAKEWORD(2,2),&Wsa ))
	{
		return false;
	}
	Sock_Server = socket( AF_INET , SOCK_STREAM , 0 );
	if ( Sock_Server == INVALID_SOCKET  )
	{
		WSACleanup();
		return false ;
	}
	AddrServer.sin_family = AF_INET ; 
	AddrServer.sin_port = htons( PORT );
	AddrServer.sin_addr.S_un.S_addr = inet_addr( IP );

	if ( bind( Sock_Server , (SOCKADDR*)&AddrServer , sizeof(AddrServer) ) )
	{
		closesocket( Sock_Server );
		WSACleanup();
		return false ;
	}
	
	if ( listen( Sock_Server , 5 )  )
	{
		WSACleanup() ; 
		return false;
	}
	LenOfAddrClient = sizeof(AddrClient);

	Sock_Client =  accept( Sock_Server , (SOCKADDR*)&AddrClient , &LenOfAddrClient );


	return true;
}


//这里是main()函数
#include <iostream>
#include "Sock.h"
#include <WINSOCK2.H>
#pragma comment(lib,"Ws2_32.lib")
#define SINGEL_SEND "single_send"
using namespace std;

char buff[20];  //recv;


//定义接受压缩图片的信息 
typedef struct bmpheader
{
	int indexBitmap;  //图片索引号
	int x , y ;          //图片的   横向、纵向  块号
	int nLength ;    //块压缩之后的大小
	int nSum ;       //计数块
	int nDisplay ;
}BMPHEADER , *pBMPHEADER;

//图片第一次发送的相关信息 
typedef struct bitinfo
{
	int bitWidth;       // 屏幕的宽度 
	int bitHeight;		//屏幕的高度 
	int bitCount;		//位图的大小 
	int bitSize;		// 图片压缩后的大小 
}BITINFO,*PBITINFO;


int main(int argc, char* argv[])
{

	CSock socks;

	if(socks.sockini() == 0 )
	{
		cout<<"初始服务端失败!";
	}


	BITINFO bit;
	bit.bitCount = 24 ;
	bit.bitHeight = 1366 ; 
	bit.bitWidth = 768 ; 
	bit.bitSize = 255 ;


	BMPHEADER bmp;
	ZeroMemory( (void*)&bmp , sizeof(BMPHEADER) );

	while (1)
	{
		bmp.indexBitmap++;
		bmp.nLength = sizeof(BMPHEADER);
		socks.recvFlag() ;
		bmp.nDisplay = 1 ;
		socks.senddata((char*)&bmp , sizeof(BMPHEADER)  ) ;
	}
	
	return 0;
}


当内存增加时发送数据,不知道为什么


我在程序中没有发现问题,但是我不知道为什么要花费约4M的内存
[/EDIT]


Send data when the memory is increasing, do not know why


i found no problem in my program , but i dont know why it cost me about 4M memory
[/EDIT]

推荐答案

尝试使用此 senddata 函数,我尚未测试,但请尝试一下.
Try this senddata function, I have not tested but give it a try.
bool CSock::senddata(char * data , int nsize)
{
      bool bRet = false;
      sendThisTime = send( Sock_Client, data, sizeof(BMPHEADER), 0  );
    if (sendThisTime > 0) {
       bRet = true;
    }
    return (bRet) ;
}


这篇关于tcp发送消息溢出!!的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆