c++ - 无法在 C++ 中将数据从服务器发送到本地网络上的客户端

标签 c++ visual-studio-2010 sockets networking

我需要在本地服务器上的两个系统之间进行通信。因此,我决定使用 C++ 中的“套接字”编程。为此,我遵循 this教程。我根据需要进行了一些更改,例如更改端口号、IP 等,这些都运行良好。现在的问题是我可以将数据从服务器发送到客户端,但我无法从客户端接收任何数据到服务器。 这是我的客户端代码:-

int main()
{
    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;
    char *message , server_reply[2000];
    int recv_size;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("192.168.1.4");
    server.sin_family = AF_INET;
    server.sin_port = htons( 8888 );

    //Connect to remote server
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    {
        puts("connect error");
        return 1;
    }

    puts("Connected");

    if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
    }
    puts("Reply received\n"); 
     server_reply[recv_size] = '\0';
    puts(server_reply);


    message = "Cleint says:- I am Client";
    if( send(s , message , strlen(message) , 0) < 0)
    {
        puts("Send failed");
        return 1;
    }
   puts("sending data complete\n");
    system("pause");

    return 0;
}

这是我的服务器代码:-

int main()
{
    WSADATA wsa;
    SOCKET s , new_socket;
    struct sockaddr_in server , client;
    int c;
      char *message , cleint_reply[2000];
    int recv_size;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
    }

    printf("Socket created.\n");

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    //Bind
    if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d" , WSAGetLastError());
        exit(EXIT_FAILURE);
    }

    puts("Bind done");

    //Listen to incoming connections
    listen(s , 3);

    //Accept and incoming connection
    puts("Waiting for incoming connections...");

    c = sizeof(struct sockaddr_in);

    while( (new_socket = accept(s , (struct sockaddr *)&client, &c)) != INVALID_SOCKET )
    {
        puts("Connection accepted");

        //Reply to the client
        message = "Server sends:- I am Server\n";

        send(new_socket , message , strlen(message) , 0);
        while(1)
        {
         if((recv_size = recv(s , cleint_reply , 2000 , 0)) == SOCKET_ERROR)
    {
     //  puts("recv failed");
    }
         else
          puts("data received");

    }
    }
    if (new_socket == INVALID_SOCKET)
    {
        printf("accept failed with error code : %d" , WSAGetLastError());
        return 1;
    }

    closesocket(s);
    WSACleanup();

    return 0;
}

这是我在客户端收到的控制台消息:-

  • 正在初始化 Winsock...
  • 已初始化
  • 已连接
  • 服务器发送:- 我是服务器
  • 发送数据完成
  • 按任意键继续

这些是我在服务器控制台上收到的消息:-

  • 正在初始化 Winsock...
  • 已创建套接字
  • 绑定(bind)完成
  • 等待传入连接..
  • 已接受连接

    所以,请告诉我们为什么我的服务器无法接收任何东西...

最佳答案

发现错误。

一旦你使用accept(),你就有了一个新的文件描述符,你需要使用它来发送和接收数据[假设是针对特定的客户端]。

The accept() function shall extract the first connection on the queue of pending connections, create a new socket with the same socket type protocol and address family as the specified socket, and allocate a new file descriptor for that socket.

在您的服务器中,当您获得新连接时,您会正确使用新文件描述符 recv_size 来发送数据,但您不会使用该新连接的文件描述符来接收数据。

错误的代码行

 if((recv_size = recv(s , cleint_reply , 2000 , 0)) == SOCKET_ERROR)

更正

 if((recv_size = recv(new_socket , cleint_reply , 2000 , 0)) == SOCKET_ERROR)

现在应该可以了

关于c++ - 无法在 C++ 中将数据从服务器发送到本地网络上的客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27578640/

相关文章:

c++ - 递归后序遍历释放二叉树节点

c# - 表单编辑器自动将子控件添加到 WPF Integration ElementHost

c# - VisualStudio 无法识别我添加的新引用

c - 为什么客户端的输出不会打印到屏幕上?

c++ - Scons 在两个不同的地方 boost 库

c++ - 具有最低值的查找元素的关联容器

c# - 听写语法与自定义语法

php - 如果尚未接受套接字,则主套接字是否仍可以使用socket_select-?

c - 为什么套接字读取的数据多于实际发送的数据?

c++ - std::initializer_list 中的 std::shared_ptr 似乎被过早销毁