手游开发小虾米: 19:57:12
大家有没有使用过socketcc,小弟我现在碰到一个比较奇怪的问题,
当用send函数发送稍微大点的数据的时候,socket会被死锁,导致程序无法继续,大家有什么见解吗
手游开发小虾米: 20:01:13
稍微debug了一下,发现死锁貌似是有recive函数造成的,可是服务器端并没有返回过东西
咣当朱: 20:01:49
恐怕就是因为服务器没返回才死锁的。
咣当朱: 20:03:11
recieve一般是block的。如果不用多线程,后果就是等。
服务器快速反馈就等的短,服务器反馈慢,就等超时。
手游开发小虾米: 20:04:22
嗯,receve函数是在别的线程里的,并没有在主线程里的
手游开发小虾米: 20:05:58
现在的死锁就是,socketcc貌似还给socket加了一个锁,不明白为什么,其中一次调用receve调用后,
receve就把socket锁住了导致了send函数不能使用socket来发送东西
手游开发小虾米: 20:08:59
网上查了好久都没有找到原因,大家开发COCOS2D-X的时候用的是什么socket呢,
我觉得socketcc太难用了,现在用js在写游戏,考虑到要bingding的话实在不知道选什么样socket比较好
水产店: 20:12:16
libuv..
手游开发小虾米: 20:12:58
@水产店: 这个是什么语言的啊
笑靥: 20:13:59
receve 的时候 你是不是调用的 RecvASCII?
手游开发小虾米: 20:15:18
没有呢,我用的是网上最常见的一段代码做的测试,int iBytesRec=mysocket->RecvData(pcRecvBuf, MAX_RECV_SIZE); 用的是这个函数做的接受
淡淡的: 20:16:08
把锁的那2行代码注掉
笑靥: 20:16:25
你打个断点进去 单步执行就知道了, 封装没有问题的。我就用的这个
笑靥: 20:16:38
看看锁哪儿了
水产店: 20:17:05
c++的
笑靥: 20:17:28
你recv是不是阻塞的?
手游开发小虾米: 20:17:32
嗯,现在是把那锁的代码注释了@淡淡的: 不知道会不会存在问题
手游开发小虾米: 20:17:50
@笑靥: 不是的
笑靥: 20:18:13
它 发送和接收是用的同一个锁。发的时候不能收, 收的时候不能发 、
手游开发小虾米: 20:18:41
@笑靥: 我看了断点,rev锁住了socket,然后send就把主线程给阻塞了
手游开发小虾米: 20:18:51
@笑靥: 嗯,是的额
笑靥: 20:19:23
哪你的recv就是阻塞形式的了 不要用这种方式
手游开发小虾米: 20:20:48
@笑靥: 恩恩,这样啊,明白了,我去改一下代码,之前学的网络的知识都忘得差不多了,
看来要去补补,谢谢你,我先去试一下看