【发布时间】:2011-03-15 01:53:39
【问题描述】:
我想发送一个字符串“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;
}
【问题讨论】:
-
您发布的代码无法编译。例如,您在类定义之外有一个析构函数 (
~Server)。 -
strlen 如果您忘记转义末尾带有 \0 的字符串,则会进入无限循环。另外,您是否尝试过使用 select()?使用它,您可以等到收到一些数据。在 TCP 套接字上,recv() 将返回提供的缓冲区可以容纳的数量
-
另一个问题(除了 Marlon 的问题):HandleConnection() 使用
new而没有delete。再说一次,你没有理由需要在这里new。您可以改用堆栈变量。 -
@Antwan:不完全是无限的——内存中通常有一个零字节阻止它进一步读取。但你是对的 - OP 在该上下文中使用
strlen()调用定义不明确或未定义的行为。 -
@Antwan:不,
recv将阻塞,直到它接收到一些数据或套接字关闭。如果它收到的数据少于您要求的数据,它将返回一个短读取而不是阻塞,直到您获得所需的数据为止。