C ++客户端服务器控制台应用程序错

时间:2014-11-09 06:27:23

标签: c++ sockets winapi networking

我是c ++的新手,我正在使用这个代码youtube。他创建了一个控制台套接字应用程序,并与telnet连接,这似乎适用于他的视频。

当我尝试相同的时候我得到无限循环和if()条件之后for循环也在dosenot工作。希望你们能帮我解决这个问题。

//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;
        }
    }

1 个答案:

答案 0 :(得分:0)

首先,如果您这样做,请再次删除==,并将其保留为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()实际上不会侦听任何内容,只会返回错误代码。

我在我的机器上尝试了你的客户端和服务器代码,至少在那里就是问题所在。请尝试将上述代码添加到您的代码中,并告知我们是否有帮助。请不要忘记将原来的帖子中的==更改为=