// 会阻塞进程,直到有客户端连接上来为止
// 既然是直到有客户端连接上,那么就要弄明白哪个是与客户端连接的套接字
// sockClient就是与客户端连接的套接字
sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len)
//接收并打印客户端数据
recv(sockClient, recvBuf, 100, 0)
printf("%s\n", recvBuf)
// 所以此处,应该把sockServer改为sockClient
send(/*sockServer*/sockClient, sendBuf, 100, 0)
PS:服务器客户端通信,是要保持服务器与客户端的连接。
而不能这样立即关闭,如果设置不对,立即关闭,缓冲区的数据是会丢失的。那客户端也就不会再收到数据了。
你可以加Sleep(10000)来测是通信过程
//关闭socket
closesocket(sockClient)
网络之间的数据传递 都可以认为是数据流的传递。具体什么意思呢?所谓协议,说白了 你就是发送一个结构体过去。你定义如下结构体//定义包头
struct PacketHeader{
int uLen//包长
int uOpCode//协议号(项目实战中常规做法。)
}
//定义一个协议。传输 int 变量的值过去。
struct Protrol{
PacketHeader head//协议头
int nBody //协议身体,就是我们要传的值。
}
然后发送的时候这么发送:
Protrol a
a.nBody = 1
a.uLen = sizeof(Protrol )
SendBuffer((const char*)&a,a.uLen)
接收端也是如此,根据Opcode的值,将收到的数据流强制类型转换成Protrol的指针就可以了。
比如收到的buff是:const char szBuff[1024]={0}
const Protrol* pMsg = (const Protrol*)szBuff
这样就可以了。pMsg ->nBody 就是你要的值。
现阶段 你学习到这个程度就够了,以后你就会发现一些问题,比如内存对齐 比如O2优化的问题。
尽管如此 这也是一个常用方法,或许你们教科书就是这么写的。这种方式非常简单。就这样。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)