>if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) > { > printf("fuck socket re\n"); > return(-1); > } > > if (connect(s, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) > { > printf("fuck connect re\n"); > close(s); > return(-1); > } > > if (send(s, buf1/*core_temp->buf_r_c*/, sizeof(buf1)/*SIZE_BUFF_C*/, 0) < 0 ) > { > printf("fuck send re\n"); > close(s); > return(-1); > } > > printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/); > > while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0) > { > printf("fuck recv re\n"); > close(s); > return(-1); > } > >Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью >malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами. > >Заранее благодарен. Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. Изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг > return(-1); > } > > printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/); > > while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0) > { > printf("fuck recv re\n"); > close(s); > return(-1); > } > >Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью >malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами. > >Заранее благодарен.
Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. Изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг > return(-1); > } > > printf("debug: send:\n%s", buf1/*core_temp->buf_r_c*/); > > while ((n = recv(s, core_temp->buf_r_s, len, 0)) == 0) > { > printf("fuck recv re\n"); > close(s); > return(-1); > } > >Сразу хочется отметить что указатели, указывают на область памяти выделенной с помощью >malloc, размер буфера порядка 50000 байт, эксперементировал с разными объёмами. > >Заранее благодарен.
Дочитав до конца, понял что проблем тут проблем сразу несколько. recv - не может принять порцию больше, чем системный буффер для данного сокета (см. getsockopt(2)/setsockopt(2) опции SO_SNDBUF и SO_RCVBUF). А эти значения для TCP не могут превышать 64K. По умолчаниюю обычно от 8 до 16К. Но для send границей пакета является сам пакет. Т.е. как системе захотелось или удобней было его передать, так она и сделала. Поэтому изначально пользователю самому предлагается склеить их. Можно также в данном случае рекомендовать вызов write в блокирующем (ждущем) режиме, но и для него нужно предусмотреть прерывание выполнение (например пришедший сигнал для другого потока может прервать его выполенение). Если все же хочется использовать recv - то посмотри на флаг MSG_WAITALL.
|