当前位置: 技术问答>linux和unix
在AIX上一次性接收和发送大数据块出问题
来源: 互联网 发布时间:2016-09-26
本文导语: 在AIX机器上接收客户端的报文,将其中的图像处理之后返回给客户端。数据量特大。 怎么保证顺利接收和发送。 如果采用非阻塞方式,则返回给客户端的数据量太太,远超过发送buffer大小(设太太大肯定不行),分开...
在AIX机器上接收客户端的报文,将其中的图像处理之后返回给客户端。数据量特大。
怎么保证顺利接收和发送。
如果采用非阻塞方式,则返回给客户端的数据量太太,远超过发送buffer大小(设太太大肯定不行),分开发送,接收端接收到的数据不对,如果采用阻塞方式的话,如果客户端告知的数据长度比实际发送来的长度大,则导致一直等待客户端发送数据。
有什么好的解决办法吗?
谢谢。
现在用的是非阻塞方式。
int value = 1;
ioctl(sockfd, FIONBIO, (char *)&value, sizeof(value));
然后又设置了发送buffer和接收buffer的大小。
可是我现在需要的是发送大块的图像数据,可能达10M。
发送的时候,如果分多次发送,则接收端会多收到一些数据,而且是在两次发送中间。
发送代码如下:
long len = image_len;
long rest = len;
while(rest > 0)
{
count = send(sockfd, ptr, SEND_BUFFER_SIZE 0)
{
count = read();
rest -= count;
}
如果len = 10000, 实际发过来的数据长度为8000,则会阻塞在count = read()语句上。
请大虾赐教。如果采用阻塞方式,则需解决接收的问题,如果采用非阻塞方式,则需解决发送的问题。
另外,不可能采用分包方式。不是技术原因。
怎么保证顺利接收和发送。
如果采用非阻塞方式,则返回给客户端的数据量太太,远超过发送buffer大小(设太太大肯定不行),分开发送,接收端接收到的数据不对,如果采用阻塞方式的话,如果客户端告知的数据长度比实际发送来的长度大,则导致一直等待客户端发送数据。
有什么好的解决办法吗?
谢谢。
现在用的是非阻塞方式。
int value = 1;
ioctl(sockfd, FIONBIO, (char *)&value, sizeof(value));
然后又设置了发送buffer和接收buffer的大小。
可是我现在需要的是发送大块的图像数据,可能达10M。
发送的时候,如果分多次发送,则接收端会多收到一些数据,而且是在两次发送中间。
发送代码如下:
long len = image_len;
long rest = len;
while(rest > 0)
{
count = send(sockfd, ptr, SEND_BUFFER_SIZE 0)
{
count = read();
rest -= count;
}
如果len = 10000, 实际发过来的数据长度为8000,则会阻塞在count = read()语句上。
请大虾赐教。如果采用阻塞方式,则需解决接收的问题,如果采用非阻塞方式,则需解决发送的问题。
另外,不可能采用分包方式。不是技术原因。
|
信号的目的是中断read操作,此时read会返回一个错误,怎么处理这个错误取决于你的程序自己了。。
|
你这根本原因还是客户端发送的长度有误啊,明明只有8个字节,非说发送了10个字节..
抛开客户端不管,服务端想退出read()也是可以的..
比较适合的方法是使用select()
使用alarm()也可以,调用简单一些,你需要设置信号处理动作
在你的程序中添加信号处理函数的定义,空的函数体就行 void foo(int sig) {}
然后signal(SIGALRM, foo);
抛开客户端不管,服务端想退出read()也是可以的..
比较适合的方法是使用select()
使用alarm()也可以,调用简单一些,你需要设置信号处理动作
在你的程序中添加信号处理函数的定义,空的函数体就行 void foo(int sig) {}
然后signal(SIGALRM, foo);
|
struct timeval timeout;
/* 30 Secs Timeout */
timeout.tv_sec = 30;
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&timeout, sizeof(struct timeval));
/* 30 Secs Timeout */
timeout.tv_sec = 30;
timeout.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO,(struct timeval *)&timeout, sizeof(struct timeval));
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。