我的程序很简单,A方把一个字符串发送到B方
B方发送一个BYTE[92*112]的数据回来(图片)B方的数据库检索和管理功能和A方的输入输入都搞定了
就是网络功能没搞定,我是第一次用CSocket
写着写着就晕掉了:((((要求必须用TCP,每个包不能超过256字节大虾给我一个简单的demo,让我理一理思路多谢,//bow
B方发送一个BYTE[92*112]的数据回来(图片)B方的数据库检索和管理功能和A方的输入输入都搞定了
就是网络功能没搞定,我是第一次用CSocket
写着写着就晕掉了:((((要求必须用TCP,每个包不能超过256字节大虾给我一个简单的demo,让我理一理思路多谢,//bow
很清楚的例子
服务器端:
首先需要添加两个Csocket类派生类,负责监听和发送。
class CListenSocket : public Csocket
class CSendSocket : public Csocket然后在APP类的InitInstance函数中添加socket初始化语句:
if (!AfxSocketInit())
{
AfxMessageBox("Socket Init failed!");
return false;
}接着在适当的地方添加创建和监听代码:
// socket初始化,最先初始化在APP类的InitInstance中。
if (!Listen.Create(1026))
{
AfxMessageBox("Socket Send Create failed!");
return 0;
} if (!Listen.Listen())
{
AfxMessageBox("Socket Send Create failed!");
return 0;
}
其中Listen是ClistenSocket类对象,CListenSocket ClearnOpenGlL2View::Listen;当系统监听到来自客户端的connect请求以后,系统自动调用CListenSocket::OnAccept函数了,注意原类中这是个虚函数,所以需要在派生类中加以重载:
void CListenSocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class pSend = new CSendSocket(); if(!Accept(*pSend))
{
AfxMessageBox("Error!");
return;
} pSend->Send("Good", 4, 0); delete pSend;
CSocket::OnAccept(nErrorCode);
}
其中pSend是CsendSocket类的指针,CSendSocket* ClistenSocket::pSend;
这样服务器端的编程任务就完成了。客户端:
客户端编程相对简单,
先在APP类的InitInstance函数中添加socket初始化语句:
if (!AfxSocketInit())
{
AfxMessageBox("Socket Init failed!");
return false;
}然后在需要的地方添加如下代码即可:
CString ss = "192.168.1.107";
CString Text;
char* buffer = new char[4];
unsigned int port = 1026; CSocket Receiver; if (!Receiver.Create())
{
AfxMessageBox("Socket Send Create failed!");
return;
}
else
{
Receiver.Connect("192.168.1.107", 1026);
} Receiver.ReceiveFrom(buffer, 4, ss, port); Text = buffer; Text = Text.Left(4); AfxMessageBox(Text); Receiver.Close();
这样客户端的编程任务也完成了。最后还有很重要的一点就是在服务器和客户机的StdAfx.h中包括头文件:
#include <afxsock.h> // socket传输需要
怎么知道数据已经接收完毕发送一个大的数据的时候是一下子发出去
当我接收数据的时候
可是每次都是256的包,要把它们重新装起来放到一块void CMyTCPSocket::OnReceive(int nErrorCode)
{
unsigned char pBuffer[256];
int nRet=0;
nRet = Receive(pBuffer, 256, 0);
m_pNetworkManager->OnReceiveTCPData(pBuffer, nRet);
CSocket::OnReceive(nErrorCode);
}这里nRet是不是不能超过256,还是我的概念出问题
应该是整个发送的所有数据的总大小如果是这样,那问题就简单了
有很多方法都可以区别的比如,你每发一个包,前面几个字节自己定义,后面跟内容,前面的几个字节可以标示你的图片文件,还可以标示包的顺序号,等等,你自己设计,但是这种方法很愚昧可以使用一个线程发送一个文件,先发长度,再发内容,发完为止。不知道你为什么要限制包小于256?代码网上多的是,到vckbase上查一下
有很多方法都可以区别的比如,你每发一个包,前面几个字节自己定义,后面跟内容,前面的几个字节可以标示你的图片文件,还可以标示包的顺序号,等等,你自己设计,但是这种方法很愚昧可以使用一个线程发送一个文件,先发长度,再发内容,发完为止。不知道你为什么要限制包小于256?代码网上多的是,到vckbase上查一下
我的双方都要发送和接收数据的A给B一个字符串
B根据这个字符串返回一个图片不是单方向的发送接收,是不是有个什么握手的过程?
我就是不知道如何处置这些东西是不是双方都要有两条CSocket
分别负责发送接收
还是一套就可以搞定还有,connect可以带我自定义的参数吗?
如果可以,就好办了不好意思,我说限制包大小是以前用UDP的条件
现在用TCP当然不需要我自己手动控制了
这个太烂了