[英]C++ recv() problem
我想發送一個字符串“ Hello there”,但我只會得到“ re”。 這是為什么?
void Accept()
{
SOCKADDR_IN sock;
int intsock = sizeof(sock);
remoteSocket = ::accept(desc, (LPSOCKADDR)&sock, &intsock);
if(remoteSocket == -1)
{
cout << "Error in Accept()" << endl;
}
HandleConnection();
}
void HandleConnection()
{
cout << "You are connected !!!" << endl;
char* temp = new char[20];
Recv(temp);
cout << temp << endl;
}
void Send(const char* buffer)
{
if((::send(remoteSocket, buffer, strlen(buffer), 0)) < 0)
{
cout << "Error in Send()" << endl;
}
}
void Recv(char* buffer)
{
int n = 0;
while((n = ::recv(remoteSocket, buffer, strlen(buffer), 0)) 0)
{
buffer[n] = 0;
}
}
~Server()
{
WSACleanup();
}
};
int main()
{
Server s;
s.Initialize();
s.Socket();
s.Bind();
s.Listen();
while(1)
{
s.Accept();
}
return 0;
}
盡管@Billy ONeal指出了析構函數問題,您還是在循環中執行recv()
,但是每次覆蓋接收到的緩沖區時。 我相信您想要這樣的東西:
// Pass buffer and its real size. This function takes care of NULL termination.
size_t Recv(char* buffer, size_t size) {
size_t total = 0, n = 0;
while((n = ::recv(remoteSocket, buffer+total, size-total-1, 0)) > 0) {
total += n;
}
buffer[total] = 0;
return total;
}
int main() {
char buffer[128];
// Connect or whatever (and set your global remoteSocket)
Recv(buffer, sizeof(buffer));
cout << buffer << endl;
return 0;
}
我認為問題是這行代碼while((n = ::recv(remoteSocket, buffer, strlen(buffer), 0)) 0)
您正在使用strlen(buffer)
來獲取不正確的緩沖區大小,您應該將sizeof(buffer)
傳遞給Recv
函數。
如果那不是問題,那么這是問題之一:P
編輯:
正如Kitsune和Mark所指出的,sizeof(buffer)將返回4或8個字節,因為它是在堆上分配的,並且僅僅是指向內存塊的指針。 如果選擇使用堆棧( char buffer[20]
而不是new char[20]
),則可以將sizeof(buffer)傳遞給Recv函數。 否則,只需使用硬編碼20。
這是您的代碼應如下所示:
void HandleConnection()
{
cout << "You are connected !!!" << endl;
char temp[20]; // <-- now we have an array
Recv(temp, sizeof(temp)); // <-- sizeof(temp) will give us 20, not 4 anymore
cout << temp << endl;
}
Recv(char* buffer, size_t buffer_size)
{
recv(remoteSocket, buffer, buffer_size, 0);
}
您需要指定接收數據的緩沖區的大小-它不是strlen(buffer)
。
如果緩沖區數組在本地定義為數組(不在參數列表中),或者緩沖區是在函數中可見的全局或文件范圍數組,則可以使用sizeof(buffer)
。 否則,您需要使用傳遞給Recv()
函數的額外緩沖區大小參數-也就是說,如果緩沖區是在另一個函數中定義的,或者是動態分配的。 (在代碼中,數組定義在Recv()
不可見,因此您需要確保Recv()
以某種方式知道大小-作為顯式的額外參數,或者因為將緩沖區包裝在一個適當的類中,該類包括告訴您為其持有的緩沖區分配了多少空間的方法。
當然,所示的代碼不會編譯,因為 buffer
實際上並未在任何地方定義或聲明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.