【问题标题】:C++ Server reply properlyC++ 服务器正确回复
【发布时间】:2015-06-25 08:29:35
【问题描述】:

我想创建一个回复我的套接字的服务器。 我有这样的代码:

#define DEFAULT_BUFLEN 512

    /*...*/
int iResult;
int iSendResult;
char recvbuf[DEFAULT_BUFLEN];
int recvbuflen = DEFAULT_BUFLEN;  

    /*...*/     

iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
if (recvbuf == "hello"){
    iSendResult = send(ClientSocket, "Hi Client", sizeof("Hi Client"), 0);

}else {printf("[ERROR]Unexpected Socket.\n"); }

现在,它不起作用。我现在不知道为什么。我尝试在网上搜索一些东西(结果很差)。 我怎样才能让它工作?我愿意更改所有代码。

【问题讨论】:

  • if (recvbuf == "hello") 不太可能起作用。另外recvbuf 应该是一个char 数组,那么你可以使用strcmp("hello",recvbuf ) == 0 作为条件。
  • 在发送时使用recv 返回的值在几乎所有情况下都不会像您希望的那样工作。您应该检查recv 返回的值是否有错误。

标签: c++ windows sockets server reply


【解决方案1】:

您不能将 C 风格的字符串与 == 进行比较。您将缓冲区的地址与静态字符串文字的地址进行比较,这将始终不相等。

您还需要处理这样一个事实,即每次从流套接字读取(假设就是这样)可能会提供比您预期更多或更少的数据。

更正确的比较可能是

if (iResult < 0) {
    // Some kind of read error, check errno for details
} else if (iResult == 0) {
    // Socket was closed
} else if (iResult < 5) {
    // Not enough input: read some more or give up
} else if (std::equal(recvbuf, recvbuf+5, "hello")) {
    // Expected input: there might be more data to process
} else {
    // Unexpected input
}

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2021-07-10
    相关资源
    最近更新 更多