Tcp Winsock服务器消息不是';t在客户端终端上显示

Tcp Winsock服务器消息不是';t在客户端终端上显示,tcp,server,winsock,winsock2,Tcp,Server,Winsock,Winsock2,我创建了一个简单的TCP服务器,监听8080端口,一旦建立了连接,它就会向客户端发送消息。这是密码 #include <iostream> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #pragma warning(disable:4996) int main(int argc, char* argv[]) { WSADATA wsa; SOCKET s, new_socket;

我创建了一个简单的TCP服务器,监听8080端口,一旦建立了连接,它就会向客户端发送消息。这是密码

#include <iostream>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable:4996) 

int main(int argc, char* argv[]) {
    WSADATA wsa;
    SOCKET s, new_socket;
    int c;
    int ret;
    struct sockaddr_in server, client;
    char* message = "Thank you for connecting to us but i got to go\n";

    if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
        printf("Failed to initialize Winsock : %d", WSAGetLastError());
        return 1;
    }



    s = socket(AF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET) {
        printf("Error creating socket : %d", WSAGetLastError());

    }


    server.sin_family = AF_INET;
    server.sin_port = htons(8080);
    server.sin_addr.s_addr = INADDR_ANY;


    if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
        printf("Error binding socket : %d\n", WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    listen(s, 3);

    puts("Listening for incoming connection\n");
    c = sizeof(struct sockaddr_in);
    while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET) {
        puts("Connection established\n");
        send(new_socket, message, strlen(message), 0);
    }

    if (new_socket == INVALID_SOCKET) {
        printf("Connection failed : %d", WSAGetLastError());
        return 1;
    }

    closesocket(s);
    WSACleanup();


    return 0;

}
这是服务器端

Listening for incoming connection

Connection established

但即使在服务器表示建立了连接之后,客户端仍然保持“连接到本地主机”。我发送消息“感谢您连接到我们,但我得走了”\n但它没有显示在客户端。有什么可能出错呢?

看起来,这是一个愚蠢的错误

while (new_socket = accept(s, (struct sockaddr*)&client, &c) != INVALID_SOCKET)
由于在初始化
new\u socket
之后,我没有在new\u socket=accept(s,(struct sockaddr*)和client,&c上加上另一个括号,因此在
accept
函数返回上应用了不等式

正确的语法应该是

while ((new_socket = accept(s, (struct sockaddr*)&client, &c)) != INVALID_SOCKET)

由于telnet不仅仅是一个原始发送/接收字节通道,您的telnet客户端在尝试连接时可能正在等待对其发送的选项的响应(协议由描述。出于测试目的,您最好构建自己的客户端。如果您费心检查系统调用,特别是
send()
,您会立即发现这个问题。不要这样编写代码。
while ((new_socket = accept(s, (struct sockaddr*)&client, &c)) != INVALID_SOCKET)