首页 > 解决方案 > 接收缓冲区数据时套接字错误 10054 - winsock2.h 库

问题描述

我是 websocket 编程的新手。我有一个客户端和一个服务器分别运行,它们都是在 Windows 7 上从 C 编译的。服务器运行良好,绑定、连接和消息传递成功。然而,让我感兴趣的是它没有出现在 netstat 命令中,监听确定的端口(9002)。客户端初始化时,会收到错误 10054,即“Connection reset by peer”。我已经在 Window 的防火墙上启用了这两个应用程序,重新启动了机器,但我无法弄清楚发生了什么。

客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define PORT 9002

int main(int argc, char *argv[]) 
{
    WSADATA wsa;

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

    SOCKET network_socket; // create a socket
    // network_socket = socket(domain, type, protocol)
    network_socket = socket(AF_INET, SOCK_STREAM, 0);
    // domain: AF_INET (IPv4 protocol) / AF_INET6 (Ipv6 protocol)
    // type: SOCK_STREAM (TCP protocol) / SOCK_DGRAM (UDP protocol)
    // protocol: Internet Protocol (IP) - 0

    if (network_socket == INVALID_SOCKET) {
        printf("Socket creation error: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    // specify an address for the socket
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET; // specifies protocol IPv4
    server_address.sin_port = htons(PORT); // specifies port
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

    if (inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr) <= 0 ) {
        printf("Invalid address / Address not supported: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    // connection 
    int connection_status = connect(network_socket, (struct sockaddr *) &server_address, sizeof(server_address));

    // check for error in the connection
    if (connection_status < 0) {
        printf("Connection error: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    // Receive data from the server
    char buffer[256]; // server response
    if ((recv(network_socket, buffer, sizeof(buffer), 0)) == SOCKET_ERROR) {
        printf("Receive error: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    // print the server's response
    printf("The server sent the data: %s\n", buffer);

    // close the socket
    closesocket(network_socket);
    WSACleanup();
    return 0;
}

服务器端代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <winsock2.h>
#include <windows.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#pragma comment (lib, "Ws2_32.lib")
#pragma comment (lib, "Mswsock.lib")
#pragma comment (lib, "AdvApi32.lib")

#define PORT 9002

int main(int argc, char *argv[]) 
{
    WSADATA wsa;

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

    // create the server socket
    SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);

    if (server_socket == INVALID_SOCKET) {
        printf("Could not create socket: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }

    // define the server address
    struct sockaddr_in server_address;
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(PORT);
    server_address.sin_addr.s_addr = inet_addr("127.0.0.1");

    // bind the socket to our specified IP and port
    if ((bind(server_socket, (struct sockaddr*) &server_address, sizeof(server_address))) == SOCKET_ERROR) {
        printf("Binding failed: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }
    puts("Binding done!");

    // listen for connections
    listen(server_socket, 5);

    // accept the connection
    puts("Waiting for incoming connections...");

    SOCKET client_socket;
    if (client_socket = accept(server_socket, NULL, NULL) == INVALID_SOCKET) {
        printf("Error accepting connections: %d\n", WSAGetLastError());
        WSACleanup();
        return EXIT_FAILURE;
    }
    puts("Connection accepted!");

    // send the message
    char *server_message = "You have reached the server!";
    send(client_socket, server_message, sizeof(server_message), 0);
    puts("Message sent!");

    // close the socket
    closesocket(server_socket);
    WSACleanup();
    return 0;
}

客户端程序输出以下内容:

Initializing Winsock... Initialized.
Receive error: 10054

服务器端程序输出以下内容:

Initializing Winsock... Initialized!
Binding done!
Waiting for incoming connections...
Connection accepted!
Message sent!

请,任何提示和想法将不胜感激。谢谢。

标签: cwebsocketwinsockwinsock2winsockets

解决方案


推荐阅读