求一份unity中Socket-TCP从服务器接收数据方法的代码

求一份unity中Socket-TCP从服务器接收数据方法的代码,第1张

TCP协议通信,接收方接收数据的前后次序与发送方一致,但数据包不一定一致。打个比方,发送方按顺序发送了2个数据包,接收可能仅接收1次就能全部收到,也可能需要收2次才能收到,也可能收3次,每次收到的数据大小不一定和发送方发送的数据包大小一样,但最终收到的总数据是一致的。
从你的程序来看,客户端连续发送2包数据,服务器端有可能一次就全部接到,也可能分2次收到,也可能会收2次以上才能收到。如果在发送“########helloworld”和“######whatisit”之间增加一些延时语句,比如延时1秒,那么可以肯定服务器端只能收到1次,因为在发送第1包数据的时候,服务器端就接收到一次数据,而在发送第2包数据时,服务器已经不再有接收动作了。
就现在的客户端程序来说,如果要在服务器端收到所有数据,可以考虑在服务器端循环接收数据,拼装数据,直到收不到数据为止,然后输出所有接收到的数据。
while(1)
{
int rr;
sock_fd = accept( sock, NULL, NULL);
retval = 0;
while(1)
{
rr = recv( sock_fd, buf1, MAX_BUFLEN, 0 );
if(rr==0) break;
memcpy(buf+retval,buf1,rr);
retval+=rr;
}
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
可以试试看。仅供参考。

我刚刚做了个winSock与采集器的通讯和继电器板卡的通讯,皆成功注意点:IP地址,端口,协议这三样要准确,发送有二种方式:字符串,二进制串,接收也要对应的有的通讯卡,返回中包含发送的内容是正常的,也有的板卡无返回的

一个线程处理所有客户端的receive *** 作是很常用的方法。
FreeBSD下的KQueue,Linux下的epoll,Windows下的完成例程模型,以及三个系统下都能用的select、前两个系统下可以用的poll,都是一个线程处理多个套接字。
三个系统下socket可以设置为非阻塞方式,此时如果调用recv需要等待数据来,那么就会直接返回错误而不是在那边等;只有数据已经来了,调用recv才会成功。如果程序没事做,正确的方法也不是死循环去轮训这些套接字,而是将这些套接字填入一个“集合”(FDSET),然后用select函数在这个集合上面等待,这个集合中有套接字能收数据了,等待就结束。
这里select的等待就类似你那里面的recv的等待。只不过recv在一个套接字上等待的时候线程就会停止运行,而select可以在一堆套接字上同时等待。

直接用>排除服务器正在维护,一直在维接收数据请试试以下几点:
重新登陆/安装/重启电脑/
请校正您的系统时间与真实时间一致
如果设置过固定IP地址的请设定回自动获取IP
进入INTELNET属性——连接——局域网设置
将代理的全部取消勾选
并在Internet选项→高级标签中
将(检查发行商的证书是否吊销和检查服务器证书吊销)两个保持在未勾选的状态
将(使用SSL 30和使用TLS 30)保持打勾
如果还是不行,请检查自己的网络,或拨打客服电话问问是否自己家附近有网络故障。

如果用SQL数据库服务器就比较简单,但是非要用winsock来实现的话,只能参照下面:
客户端把查询字符(sql)串发给服务器,服务器根据查询字符进行查询,然后将记录集转换成数组发给客户端,客户端再将收到的数据转换为记录集显示。
Public Function RsToBin(Rs As Recordset) As Variant
Dim objStream As Stream
Set objStream = New Stream
objStreamOpen
objStreamType = adTypeBinary
RsSave objStream, adPersistADTG
objStreamPosition = 0
RsToBin = objStreamRead()
Set objStream = Nothing
End Function
Public Function BinToRs(vData As Variant) As Recordset
Dim objStream As Stream
Dim objRs As Recordset
Set objRs = New Recordset
Set objStream = New Stream
objStreamOpen
objStreamType = adTypeBinary
objStreamWrite vData
objStreamPosition = 0
objRsOpen objStream
Set BinToRs = objRs
Set objRs = Nothing
Set objStream = Nothing
End Function
第一个函数为记录集转换为数组,第二个位数据转换为记录集。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10265504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存