2013-12-10 3 views
2

Я пытаюсь создать поточную систему, отправляющую несколько изображений в принимающий сокет, который отображает их. Однако по какой-то причине я не могу понять, мой код блокируется в функции отправки после отправки 3 изображений. Это фрагмент моего кода до сих пор:C++ socket stuck data data

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); 
} 

Пытались его отладки, и, как я уже сказал, он получает blocket в последней строке, функция отправки. Интересно, существует ли ограничение на количество информации, которую вы можете передать через сокет. Если я переведу предложение for перед созданием сокета, он работает как шарм, но я не собираюсь создавать бизиллионные сокеты. Любая помощь?

+1

Удален ли конечный конец? Сокеты не имеют неограниченного размера буфера, поэтому, если удаленный конец застопорился, отправляющий сокет почти наверняка заблокируется. –

+0

Да, удаленный конец все еще получение. Я все еще могу отправить информацию из других источников. – user2938976

+0

Возможно, вы захотите выбрать другой подход для отправки данных. – bvj

ответ

3

Вызов send() будет блокироваться, если размер окна TCP будет равен нулю. Это почти всегда результат другой стороны соединения, не потребляющей данные из вызова recv().

Также возможно, что imgSize чрезвычайно огромен, и просто требуется столько времени, чтобы приемник потреблял поток.

Вы не использовали ни одного кода со стороны приемника, поэтому это сложно сказать.

Я предлагаю больше отладочных отбросов (операторов печати), отображающих значение imgSize и возвращаемое значение посылающего вызова. То же самое для стороны recv.

Обратите внимание, что только потому, что вы отправили imgSize байты в один вызов, удаленный ресивер может не принимать все эти байты в течение одного вызова recv().