我是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;
}
}
答案 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()
实际上不会侦听任何内容,只会返回错误代码。
我在我的机器上尝试了你的客户端和服务器代码,至少在那里就是问题所在。请尝试将上述代码添加到您的代码中,并告知我们是否有帮助。请不要忘记将原来的帖子中的==
更改为=
!