2

我正在尝试开发一个流系统,将多个图像发送到一个接收套接字,该套接字显示它们。但是,由于某种我无法理解的原因,我的代码在发送大约 3 张图像后在发送函数处被阻止。到目前为止,这是我的代码片段:

portno = atoi(argv[2]);

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) 
    error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
    fprintf(stderr,"ERROR, no such host\n");
    exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr,
     server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) 
    error("ERROR connecting");
bzero(buffer,256);

for(int i=10;i<51;i++){  
    std::stringstream sstm;
    sstm << filename << i << ext;
    result = sstm.str();
    cout << result << endl;
    Mat image = imread(result, CV_LOAD_IMAGE_COLOR);
    image = (image.reshape(0,1));
    int imgSize = image.total()*image.elemSize();
    n = send(sockfd, image.data, imgSize, 0);
}

尝试调试它,正如我所说,它在最后一行,即发送函数处得到了阻塞。我想知道您可以通过套接字传输多少信息是否有限制。如果我在创建套接字之前将 for 语句移回,它就像一个魅力,但我不会创建十亿个套接字。有什么帮助吗?

4

1 回答 1

3

如果 TCP 窗口大小变为零,则 send() 调用将阻塞。这几乎总是因为连接的另一端没有使用来自 recv() 调用的数据。

也完全有可能 imgSize 非常大,接收器只需要很长时间才能消耗流。

你没有从接收方分享任何代码,所以很难说。

我会建议更多的调试 spew(打印语句)显示 imgSize 的值和 send 调用的返回值。recv 方面同上。

请注意 - 仅仅因为您在一次发送调用中发送了 imgSize 字节,远程接收器可能不会在一次调用 recv() 中接收所有这些字节。

于 2013-12-11T07:35:02.180 回答