我已经为自己个人使用了一个服务器应用程序,但是当客户端断开连接时我总是遇到问题。我刚刚意识到这是由recv
函数返回的项目无法正确识别引起的。
例如:
char* mrecv(bool show, LPVOID pointerToObject) //Recieve a message
{
int iResult2 = recv(ClientSocket, recvbuf, 512, 0);
if (iResult2 > 0) {
if ((strncmp(recvbuf,"/",1)) != 0) {
printm(recvbuf, pointerToObject);
}
else if (iResult2 == 0) {
printf("Connection closing...\n");
closesocket(ClientSocket);
WSACleanup();
return "1";
}
else {
printm("recv failed with error: %d\n", WSAGetLastError());
printm("Client must have disconnected. Please select a new client.");
return "1";
}
return recvbuf;
}
当客户端断开连接时,该函数会正确地向父函数返回“1”。但是,当我检查它时......:
DWORD WINAPI recvfunc(LPVOID pointerToObject)
{
while (true) {
ClientSocket=client[currentclient].cs;
char* p = mrecv(true, pointerToObject);
std::cout<<p<<"\n";
if ( p == "1") {
client[currentclient].con=false;
ClientSocket=client[lastclient].cs;
return 1;
}
}
return 0;
}
if
语句返回false,无论检查是否返回"1"
,但1
完美地打印到屏幕上。
任何人都知道为什么会这样?
如果你没有注意到,我正在使用winsock。
提前致谢:)
EDIT :: 这个编辑的所有下面的答案似乎都是一样的,他们都解决了这个问题。如果你看看那里列出的第一个函数^,你会发现我之前显然遇到过这个问题并且不得不使用这个解决方案。所以看起来我的大脑有点放弃了我。无论如何,感谢所有的帮助。 :)
答案 0 :(得分:4)
您的mrecv
会返回char*
类型的结果。
您的比较:
if (mrecv(true, pointerToObject)=="1")
是指针比较,而不是字符串比较。仅当字符串"1"
的两个实例恰好存储在同一地址时才是真的。
要比较字符串,请使用strcmp
功能。或者,由于您使用的是C ++,请考虑使用std::string
类(它具有进行字符串比较的重载==
函数)而不是使用原始C样式字符串。
答案 1 :(得分:2)
尝试:
if (strcmp(mrecv(true, pointerToObject), "1") == 0)
答案 2 :(得分:0)
答案 3 :(得分:0)
您正在比较char指针,并且无法保证一个指针与另一个指针相等:
试试这个:
if (mrecv(true, pointerToObject)[0] == '1')
您现在将mrecv
返回的第一个字节与字符1
进行比较。
但是,我强烈建议您返回整数返回码,而不是字符。
答案 4 :(得分:0)
你的问题是你不能以这种方式使用带有C风格字符串(char数组)的==运算符,因为被比较的不是字符串的内容,而是指向第一个字符的指针的值因为你真的把char *比作char *。如果要比较实际值,则需要取消引用返回的指针,并将其与字符值进行比较,而不是字符串文字(单引号而不是双引号):
if (*mrecv(true, pointerToObject) == '1') {