使用winsock2,比较两个看起来相等的字符会发现不相等



你好,stackoverflow的优秀社区!我已经在这个网站上潜伏了大约一年了,只是需要发布一个问题。我在编码方面有点笨拙,所以对我宽容一点。

以下是代码(大部分是示例winsock MSDN代码:p):

客户:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
// Need to link with Ws2_32.lib, Mswsock.lib, and Advapi32.lib
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")
void clarify(char *recvdata);
char mdata[7];
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "10150"
int main(int argc, char **argv) 
{
WSADATA wsaData;
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo *result = NULL,
*ptr = NULL,
hints;
char recvbuf[DEFAULT_BUFLEN];
int iResult;
int recvbuflen = DEFAULT_BUFLEN;
// Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed with error: %dn", iResult);
return 1;
}
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
// Resolve the server address and port
iResult = getaddrinfo("173.21.56.58", DEFAULT_PORT, &hints, &result);
if ( iResult != 0 ) {
printf("getaddrinfo failed with error: %dn", iResult);
WSACleanup();
return 1;
}
// Attempt to connect to an address until one succeeds
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) {
// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ldn", WSAGetLastError());
WSACleanup();
return 1;
}
// Connect to server.
iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR) {
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
continue;
}
break;
}
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET) {
printf("Unable to connect to server!n");
WSACleanup();
return 1;
}
// Send an initial buffer
char sendbuf[512];
std::cin.getline(sendbuf, 512);
iResult = send( ConnectSocket, sendbuf, 512, 0 );
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %dn", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
std::cout<<"sendbuf: "<<sendbuf<<"n";
std::cout<<"strlen(sendbuf): "<<strlen(sendbuf)<<"n";
printf("Bytes Sent: %ldn", iResult);
// Receive until the peer closes the connection
do {
iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0);
if ( iResult > 0 )
printf("Bytes received: %dn", iResult);
else if ( iResult == 0 )
printf("Connection closedn");
else
printf("recv failed with error: %dn", WSAGetLastError());
std::cout<<"recvbuf: "<<recvbuf<<"n";
std::cout<<"recvbuflen: "<<recvbuflen<<"n";
std::cout<<"strlen(recvbuf): "<<strlen(recvbuf)<<"n";
std::cout<<recvbuf[0]<<"n";
std::cout<<recvbuf[1]<<"n";
std::cout<<recvbuf[2]<<"n";
std::cout<<recvbuf[3]<<"n";
std::cout<<recvbuf[4]<<"n";
std::cout<<recvbuf[5]<<"n";
std::cout<<recvbuf[6]<<"n";
std::cout<<recvbuf[7]<<"n";
std::cout<<recvbuf[8]<<"n";
std::cout<<recvbuf[9]<<"n";
std::cout<<recvbuf[10]<<"n";
std::cout<<recvbuf[11]<<"n";
std::cout<<recvbuf[12]<<"n";
clarify(recvbuf);
std::cout<<"mdata(main()): "<<mdata<<"n";
if (mdata == "anarchy") {std::cout<<"This is Anarchy. :)";}
else {std::cout<<"Nope. :( ";}
} while( iResult > 0 );
std::cin.ignore();
// shutdown the connection since no more data will be sent
iResult = shutdown(ConnectSocket, SD_SEND);
if (iResult == SOCKET_ERROR) {
printf("shutdown failed with error: %dn", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
void clarify(char *recvdata)
{
std::cout<<"recvdata: "<<recvdata<<"n";
for (int i=0; i<(strlen(recvdata)); i++) {
mdata[i]=recvdata[i];
std::cout<<mdata[i]<<"n";
}
std::cout<<"mdata(clarify()): "<<mdata<<"n";
}

服务器代码是MSDN winsock的示例代码。

我意识到代码中添加了一些草率的附加内容,但请放心,这些都是我自己的想法和提醒。所以,请不要麻烦告诉我其他地方我可以清理。当我接近完成我的项目时,我会处理好这件事(还有很长的路要走:))。

因此,我在比较"mdata"变量和"无政府状态"字符时遇到了问题。即使我通过winsock发送"无政府状态",它也会返回为"无政府",并且我通过"clarify()"运行它,这似乎仍然不等于"无政府主义"。

我确信这是我在这里犯的一个小错误,所以请对我宽容一点…

编辑:以下是为"sendbuf"输入键入"无政府状态"后的输出:

anarchy
sendbuf: anarchy
strlen(sendbuf): 7
bytes sent: 512
bytes recieved: 512
recvbuf: anarchy
recvbuflen: 512
strlen(recvbuf): 7
a
n
a
r
c
h
y
f
4
i
w
,
recvdata: anarchy
a
n
a
r
c
h
y
mdata(clarify()): anarchy
mdata(main()): anarchy
Nope :(

您正在将c字符串文字的地址与存储在mdata中的地址进行比较。

if (mdata == "anarchy") {std::cout<<"This is Anarchy. :)";}

"无政府状态"是一个字符串,有一个地址。您正在将该任意地址与存储在mdata变量中的地址进行比较。它们不是相同的地址,因此相等性检查失败。

您的意思不是比较存储两个字符串的地址,而是比较存储在这些字符串中的字符。

strncmp是你在这里的朋友。

最新更新