基本服务器/客户端代码出现问题

Issue with basic server/client code

本文关键字:问题 代码 客户端 服务器      更新时间:2023-10-16

我试图用C++自学一些网络编程,但我遇到了一些似乎无法解决的核心问题。

我有两个程序在同一个VS项目中——一个客户端和一个服务器。他们不交换信息,只是连接并告诉我连接何时建立。这是客户端文件-

服务器.CPP

#include "stdafx.h"
using namespace std;
int main()
{
    //setting up WSA
    WSADATA wsaData;
    int WSAcheck = WSAStartup(MAKEWORD(2, 2), &wsaData);
    //checking WSA
    if (WSAcheck != 0)
    {
        printf("WSA couldn't start correctlyn");
        pause();
        exit;
    }
    //setting up the socket
    SOCKET serversock = socket(AF_INET, SOCK_STREAM, 0);
    //checking socket's validity
    if (serversock == INVALID_SOCKET)
    {
        printf("Socket isn't valid: %dn", WSAGetLastError());
        pause();
        exit;
    }
    //setting up the sockaddr_in for bind()
    sockaddr_in server_sockaddr;
    server_sockaddr.sin_family = AF_INET;
    server_sockaddr.sin_addr.s_addr = INADDR_ANY;
    server_sockaddr.sin_port = htons(25565);
    //binding the socket.
    int bindcheck = bind(serversock, (struct sockaddr *)&server_sockaddr, sizeof(server_sockaddr));
    //checking to see if the bind worked, and calling the error if it doesn't
    if (bindcheck != 0)
    {
        printf("Bind failed: %dn", WSAGetLastError());
        pause();
        exit;
    }
    //setting the socket to listen
    int listencheck = listen(serversock, 10);
    //checking to make sure the listen command was successful
    if (listencheck != 0)
    {
        printf("Listen failed: %dn", WSAGetLastError());
        pause();
        exit;
    }
    //telling that the socket is being set to listen
    printf("Socket is ready to accept connectionsn");
    //accepting any incoming connections
    SOCKET clientsocket = accept(serversock, NULL, NULL);
    //checking the socket
    if (clientsocket == INVALID_SOCKET)
    {
        printf("Connecting socket isn't valid or has timed out: %dn", WSAGetLastError());
        pause();
        exit;
    }
    //ending the program
    printf("finn");
    pause();
}

客户.CPP

#include "stdafx.h"
using namespace std;

int main()
{
    //setting up WSA
    WSADATA wsaData;
    int WSAcheck = WSAStartup(MAKEWORD(2, 2), &wsaData);
    //checking WSA
    if (WSAcheck != 0)
    {
        printf("WSA couldn't start correctlyn");
        pause();
        exit;
    }
    //setting up the socket
    SOCKET clientsock = socket(AF_INET, SOCK_STREAM, 0);
    //checking socket's validity
    if (clientsock == INVALID_SOCKET)
    {
        printf("Socket isn't valid: %dn", WSAGetLastError());
        pause();
        exit;
    }
    //setting up the struct with the connection info
    sockaddr_in serverinfo;
    serverinfo.sin_family = AF_INET;
    serverinfo.sin_addr.s_addr = INADDR_ANY;
    serverinfo.sin_port = htons(25565);
    //connecting
    printf("Trying to connectn");
    connect(clientsock, (SOCKADDR *)&serverinfo, sizeof(serverinfo));
    printf("Passed the connect functionn");
    pause();
}

STDAFX.H

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <Ws2tcpip.h>
#include <Inaddr.h>
#include <string.h>
#include <io.h>
#include <Windef.h>
#include <Ws2tcpip.h>
#include <WinNT.h>
#include <Windows.h>
#include <tchar.h>
void pause(void);  //defined in stdafx.cpp

pause被定义为getchar(),用来中断代码以查看发生了什么

客户端的输出是-

尝试连接
通过连接功能

而不管服务器进程是否正在运行。

服务器的输出是

插座已准备好接受连接

不管我考什么,我都无法通过考试。

我做错了什么?

您在客户端中出现错误。这很糟糕:

serverinfo.sin_addr.s_addr = INADDR_ANY;

您必须以二进制格式写入服务器IP地址,而不是INADDR_ANY,如果它们在同一服务器中运行,则可能为127.0.0.1。使用此功能将文本IP地址转换为二进制IP地址:

INT WSAAPI InetPton(
  _In_   INT  Family,
  _In_   PCTSTR pszAddrString,
  _Out_  PVOID pAddrBuf
);

https://msdn.microsoft.com/en-us/library/windows/desktop/cc805844(v=vs.85).aspx

代码是:

if(InetPton(AF_INET, "192.168.0.1", (void*)&serverinfo.sin_addr.s_addr) <= 0)
{
    //error
}