http://blog.csdn.net/fallinlovelj/article/details/48020013
TCP Server,这个是VC版本的 应该能直接编译过
需要修改
unsigned char type = 1 ;
send(client_sockfd,(const char *)&type , 1 , 0 ) ;的type值来做调试
MapViewOfFile是把所有文件的内容打到socket
.
另外Client(http://blog.csdn.net/fallinlovelj/article/details/48019995)侧代码有点Bug,我刚才改了下,你可以参照
FileTransport::Fetch3 的325-333来修改
也就是说每次Recv一块内存时,必须是while(1)的recv,计算每次得到的size,看是否与预期的一致,别的地方可以参照这个改
【最新注释】
Server模块化了一下.
oNetComm类中包含两个函数OpenCursor Fetch
OpenCursor 的作用是接收C lient端传递的参数.例如Client端传的是mesh + sql
“533945203 select * from aaaaaaaa”
这时候OpenCursor 应该收到的是这个字符串。
int Data = 0 ;
char *pdata= (char*) &Data ;
char ch[4] = {0 } ;
int sizeRead = 0 ;
while( sizeRead < 4 )
{
memset(ch,0x00,sizeof(ch) ) ;
int isize = ::recv(client_sockfd , ch , 4 , 0 ) ;
printf("[%d] character receieved,[%s]\n" ,isize , ch) ;
memcpy(pdata , ch ,isize ) ;
pdata += isize ;
sizeRead += isize ;
}
这段代码的意思是先取得Client端发的数据长度(“533945203 select * from aaaaaaaa”的长度)
char chBuf[1024] = {0} ;
char *pBuf = chBuf ;
char chSize[1024] = {0};
while(sizeRead<Data)
{
memset(chSize,0x00,sizeof(ch) ) ;
int isize = ::recv(client_sockfd , chSize , Data , 0 ) ;
printf("[%d] character receieved,[%s]\n" ,isize , chSize) ;
// printf(ch);
memcpy(pBuf , chSize ,isize ) ;
pBuf += isize ;
sizeRead += isize ;
}
这段代码的意思是接收服务器端的参数。也就是”533945203 select * from aaaaaaaa”
::send(client_sockfd ,(const char*)&ctype , 1 , 0 ) ;
在接收完参数之后,服务器要做一些操作,例如查询sql,并制作二进制文件(猜测的功能吧)
在做完文件后,使用上面这个代码通知客户端,文件已经做好了.
下面我们来看看Client端的OpenCusor都做什么了
::send(fd,&idatasize,sizeof(int) , 0 ) ;
::send(fd,ch,idatasize ,0);
char chm ={0};
::recv( fd , &chm , 1 , 0 ) ;
之后就是双方都进行Fetch。客户端是读,sever是写.
补充:
其实整个过程完全是TCP的握手的过程。体会一下就知道了。
另外,由于代码不是真正的使用代码,建议Server每次调试时都重新启动一次。
例如,第一次调试用的是 test.exe 10.10.93.67 2000,第二次改成test.exe 10.10.93.67 2001
这是因为Server进程结束之后,其实他所创建的Socket并不一定关闭了,而是处于TIME_WAIT的状态,再次使用同一port可能有问题.
Client代码建议使用Fetch3()