在多线程中如何使用send()函数

fjtusx 2002-02-22 05:32:18
在服务器端的线程中使用send()函数,编译没有错,程序运行也正常,但是客户端接收不到任何地数据,为什么?
请各位高手指点!
...全文
212 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
strip 2002-02-27
  • 打赏
  • 举报
回复
客户端调用WSAGetLastError看看是什么错误
cmpp 2002-02-27
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/544/544226.xml
cmpp 2002-02-27
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/544/544226.xml
fjtusx 2002-02-23
  • 打赏
  • 举报
回复
send函数的返回值是-1,

但是另外一个程序也是同样的原理程序运行正常,客户端可以收到数据
cmpp 2002-02-23
  • 打赏
  • 举报
回复
我来学习一下 !
111222 2002-02-23
  • 打赏
  • 举报
回复
Return Values
If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len for nonblocking sockets. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.


你WSAGetLastError一下看看错误码

然后通过error lookup看看是什么错误
ydogg 2002-02-22
  • 打赏
  • 举报
回复
察看你的send函数返回的字节数是否正确
Edward 2002-02-22
  • 打赏
  • 举报
回复
用 Socket 发送/接收数据和写入/读取文件内容的模式是一样的;没有资料说 WinSock API 是线程安全的,所以多个线程同时调用 send/recv 的安全性不能保证。本人的做法是用单一一个线程发送数据,大概做法是:

设置一个数据队列(比如说:单项链表),其他采集数据的线程把要发送的数据块附加到这个队列,然后发送数据的那个线程从这个队列中取走一个数据块发送出去。当然,这个队列要用线程同步机制来保护。

本人刚开始用 Socket 的时候也很困惑,但是如果能理解 Socket 通信在最高一层(我的意思是各种底层通信协议所作的工作就是要使发送/接收数据看起来是“按先后顺序的”)上实际是发送/接收一个数据流(大多数由特定的格式),那么所有问题都会显得简单多了。

当然,还有和多具体的技术细节问题,能归纳的最重要有:
1、send 不确保发送出去全部的数据,函数返回实际发送的数据的字节数;所以,程序要检查返回值来发送剩余的数据(用一个循环就可以了);
2、争取执行关闭过程,这个在 MSDN 上有详细的说明,参考 shutdown 的说明会得到这方面的连接。

希望对你有所启发哦。
ylb_and_xy 2002-02-22
  • 打赏
  • 举报
回复
如果服务器端的send()函数确实没有错误,那么就应该检查客户端的接收数据部分程序是否正确。在服务器发送数据时,客户端处于监视状态吗?
Lchaos 2002-02-22
  • 打赏
  • 举报
回复
检查一下send()的返回值及客户端的receive()的返回值。
(甚至应该检查Socket()是否创建成功)。查看一下有没有错误发生。

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧