【问题标题】:C++ client server Console Application errorC++ 客户端服务器控制台应用程序错误
【发布时间】:2023-03-25 15:56:01
【问题描述】:

我是 C++ 新手,我正在使用这个家伙代码 youtube。他制作了一个控制台套接字应用程序并连接到在他的视频中似乎可以使用的 telnet。

当我尝试相同的方法时,我在底部的 for 循环之后得到无限循环和 if() 条件也不起作用。希望你们能帮我解决这个问题。

//clientserver.h
#pragma comment(lib, "ws2_32.lib")
#include <sdkddkver.h>
#include <conio.h>               //for getche()
#include <stdio.h>

#include <winSock2.h>
#include <windows.h>
#include <iostream>

clientserver.cpp

#include "clientserver.h"

using namespace std;

void main(){   


    long  answer;
    WSAData wsaData;
    WORD DLLVersion;
    DLLVersion = MAKEWORD(2,1);
    answer = WSAStartup(DLLVersion,&wsaData);

      SOCKADDR_IN addr;  

    int addrlen = sizeof(addr);
    SOCKET sListen;
    SOCKET sConnect;


    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 addr.sin_family = AF_INET; //was missing

    addr.sin_port = htons(8989);
    sListen = socket(AF_INET,SOCK_STREAM,NULL);
    //the socket becomes the structure "addr" 
    bind(sListen, (SOCKADDR*)&addr, sizeof(addr));
    //now we have to say that the socket is listening for an incoming connection.

    listen(sListen, SOMAXCONN);
    for(;;){
        cout << "waiting for connection" << endl;

        if (sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)){

                cout << "socket found a connection" << endl;
//cin >> ab101;
        }
    }

【问题讨论】:

  • 您是否也有适当的客户端代码(实际连接的人)?循环是无限的是可以的,你实际上是通过不在你的 for() 中指定中断条件来告诉它这样做。如果您是 C++ 新手,那么在做一些比网络更复杂的事情之前,您应该首先掌握语言基础知识,这只是一个建议。
  • 这里是客户端pastebin.com/QFT8DM5z的代码
  • 如果您更改了原始帖子以包含答案,请在您所做的帖子本身中添加快速评论,并接受帮助您解决问题的答案。否则人们会认为这个问题没有答案,并尝试修复你的(已经更正的)代码。
  • 是的,它现在可以工作了。谢谢

标签: c++ sockets winapi networking


【解决方案1】:

首先,如果您这样做了,请再次删除==,并留下sConnect = accept(),只有一个等号。

然后将标记的行添加到您的代码中:

addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_family = AF_INET; // <----- THIS ONE RIGHT HERE!
addr.sin_port = htons(8989);
sListen = socket(AF_INET,SOCK_STREAM,NULL);

之前您已经使用 IPv4 地址系列创建了套接字:

sConnect = socket(AF_INET,  SOCK_STREAM,NULL);

并且我假设对bind() 的调用稍后会失败,因为您没有指定在SOCKADDR_IN 中使用哪个地址系列。如果它们不匹配并且无法绑定套接字,则 accept() 实际上不会监听任何内容,而是返回错误代码。

我在我的机器上尝试了您的客户端和服务器代码,至少这就是问题所在。请尝试将上述行添加到您的代码中,如果有帮助,请告诉我们。请不要忘记将 == 更改为 =,就像您原来的帖子中一样!

【讨论】:

  • 是的,我错过了这一行 'addr.sin_family = AF_INET;'非常感谢,现在可以了。
  • 另外,您可以删除sConnect = socket(AF_INET, SOCK_STREAM, NULL);,它只会让阅读您的代码的人感到困惑。这个变量无论如何都会被accept()重新分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多