Я пытаюсь разработать потоковую систему, отправляющую несколько изображений в приемный сокет, который их отображает. Однако по какой-то причине я не могу понять, что мой код блокируется функцией отправки после отправки около 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 перед созданием сокета, оно работает как шарм, но я не собираюсь создавать сокеты bizillion. Любая помощь?
Вызов send () заблокируется, если размер окна TCP станет равным нулю. Это почти всегда результат того, что другая сторона соединения не использует данные из вызова recv ().
Также вполне возможно, что imgSize очень велик, и получателю потребляется столько времени, чтобы потреблять поток.
Вы не поделились кодом со стороны получателя, поэтому сложно сказать.
Я хотел бы предложить больше отладки spew (операторы печати), показывающие значение imgSize и возвращаемое значение вызова send. То же самое для стороны recv.
Обратите внимание — только потому, что вы отправили байты imgSize за один вызов, удаленный получатель может не получить все эти байты в течение одного вызова recv ().
Других решений пока нет …