tcp发送消息溢出!! [英] tcp send message Overflow!!
本文介绍了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屋!
查看全文