Во-первых, протокол противный. Вы отправляете блоки фиксированного размера, когда хотите отправить строку с нулевым символом в конце ... было бы проще просто указать длину строки в начале сообщения.
Во-вторых, вы не правильно читаете из сокета, это просто работает, если у вас нет других сообщений в конвейере.
Если ваш цикл while был действительно использован, вы перезаписали бы первый фрагмент при любых последующих чтениях.
В любом случае, непосредственной причиной ошибки является то, что вы добавляете к строке нулевой терминатор (разделитель?). Разве это не объясняет, почему вы всегда находите свой nul по индексу 0?
Если вы не видите его, попробуйте выписать содержимое буфера как отправленное.
#define ERRBUFSIZE 51
void server(string const &name)
{
string error = "Error - Already Registered: ";
error.append(name);
char err[ERRBUFSIZE];
// you sure you want a NUL terminator at index 0??
err[0] = 0;
// can replace both lines with strcpy(err, error.c_str())
std::copy(error.begin(), error.end(), err+1);
err[error.size() + 2] = '\0';
if (send(sock, &err, ERRBUFSIZE, 0) < 0)
DieWithError("send() failed");
}
string parseString(string const &message) // no need to copy
{
// ... this is redundant anyway, see below
}
string client()
{
char msgBuffer[ERRBUFSIZE];
int bytesRcvd = 0;
int totalRcvd = 0;
while(totalRcvd != ERRBUFSIZE)
{
// Get Message from Server
// ... recv(sock, msgBuffer+totalRcvd, ERRBUFSIZE-totalRcvd) ...
if ((bytesRcvd = recv(sock, msgBuffer, ERRBUFSIZE, 0)) < 0)
DieWithError("recv() failed or connection closed prematurely");
totalRcvd += bytesRcvd;
}
cout << "Bytes received: " << totalRcvd << endl;
//sizeof(msgBuffer)==ERRBUFSIZE==totalRcvd, so this overflows
msgBuffer[totalRcvd] = '\0';
// assuming you skip the leading \0, msgBuffer is already nul-terminated
// so use string rcvMsg(msgBuffer) and skip the parseString/substr
string rcvMsg( msgBuffer , msgBuffer + totalRcvd);
cout << rcvMsg << endl;
// rcvMsg = parseString(rcvMsg);
return rcvMsg;
}