当前位置:  技术问答>linux和unix

问一个socket send的问题

    来源: 互联网  发布时间:2017-01-07

    本文导语:  现在我程序里面有两个线程 threadFunc1() { .................. pthread_mutex_lock(&mutex); .......... buf[i]=12333; pthread_mutex_unlock(&mutex); } 线程1负责往BUFF里面存放数据 threadFunc2() { pthread_mutex_lock(&mutex); .......... send(socketfd,buf,len,0); pthread...

现在我程序里面有两个线程
threadFunc1()
{
..................
pthread_mutex_lock(&mutex);
..........
buf[i]=12333;
pthread_mutex_unlock(&mutex);

}
线程1负责往BUFF里面存放数据
threadFunc2()
{
pthread_mutex_lock(&mutex);
..........
send(socketfd,buf,len,0);
pthread_mutex_unlock(&mutex);
}
线程2负责把BUFF里的数据发出去

两边采用了互斥锁来保证数据安全。

现在的问题是,当网络不好时,send函数把缓存里的数据堆满后,阻塞在这里
而互斥锁没有解锁,导致整个程序停掉了
求解。



|
友情帮顶

|
你不应该互斥send,而应该是把数据拷贝出来,再send:

tempbuff;

pthread_mutex_lock(&mutex);
..........
//copy to tempbuff
pthread_mutex_unlock(&mutex);

send(socketfd,tempbuf,len,0);

|
楼主,你这种线程间通讯方式不行的,可能在某种情况下,数据写到buffer中,却没有被发出去,而是被后面的数据覆盖了。
建议:
(1)使用pipe来做线程间数据通讯
(2)申请一个大的buffer数组(全局),通过pipe传递buffer的指针,而不是直接传输数据,这样效率能高很多。
(3)每个buffer需要一个标识flag,表明这个buffer里的数据是否已经发出去。防止数据丢失

暂时就想到这些

|
学习一下条件变量,成功修改后再学习:I/O复用。

    
 
 

您可能感兴趣的文章:

  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于socket概念的理解问题!
  • socket编程 中的bind问题
  • 你是否可以回答Socket的问题?数据先后问题
  • 多进程socket编程问题
  • Socket的问题
  • socket accept问题,大家指教。
  • socket客户端程序的问题
  • 关于多网口socket通信的简单问题
  • fgets用在SOCKET流上的问题
  • linux socket fd 写阻塞问题
  • linux下用socket实现多进程间通信问题?
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • sco unix下socket编程的问题,请大家帮忙
  • 请问socket方面的问题
  • socket编程中的问题,请各位大侠指教!
  • 急!!请教关于linux socket编程的一个问题!!
  • socket编程,使用recvfrom()函数监听问题。
  • linux下socket编程问题!
  • 请教两个小问题:一个cgywin下使用vi的问题,另一个socket的问题
  • socket send()函数错误
  • linux下socket的send函数阻塞问题?
  • 请教:socket编程中send和write的区别
  • 面试题,socket进行send操作始终send不出去该怎么办?
  • [求助]请问socket编程中send()函数可以发送整形数据吗?
  • socket send函数疑问,缓冲区
  • 请问如何捕获linux c SOCKET中SEND的错误,请指教,谢谢!
  • 关于socket的send(),recv()的问题.
  • socket send的返回值
  • socket中的疑问:read,write和send,recv的区别
  • 谁知道solaris对socket的recv和send函数是否是原子操作,谢谢!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • socket 通讯开发包 Simple Sockets
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • C++ Socket 库 C++ Sockets
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.net类socket的类成员方法: getreceivebuffersize定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.net类socket的类成员方法: gettrafficclass定义及介绍
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • java命名空间java.net类socket的类成员方法: getport定义及介绍
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • java命名空间java.net类socket的类成员方法: getlocalport定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getinetaddress定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?
  • java命名空间java.net类socket的类成员方法: isconnected定义及介绍
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3