C++tcp客户端连接失败服务端显示连接成功

醉卧南楼 2018-06-12 11:12:46
求助各位大神,在使用TCP连接的时候,服务器显示了连接,而客户端显示的是连接失败
找了半天没有发现错误所在,希望有大神帮忙讲解一下
服务端
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0) {
cout << "wsastartup error" << endl;
return 0;
}
cout << "wsastartup success" << endl;

SOCKET ListenSock;
ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSock == INVALID_SOCKET) {
cout << "ListenSock error" << endl;
WSACleanup();
return 0;
}
cout << "ListenSock success" << endl;

SOCKADDR_IN server;
server.sin_family = AF_INET;
server.sin_port = htons(5000);
server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

int r = bind(ListenSock, (SOCKADDR*)&server, sizeof(server));
if (r == SOCKET_ERROR) {
cout << "bind error" << endl;
WSACleanup();
closesocket(ListenSock);
return 0;
}
cout << "bind success" << endl;

//监听
if (listen(ListenSock, 5) == SOCKET_ERROR) {
cout << "listen error" << endl;
WSACleanup();
closesocket(ListenSock);
return 0;
}
cout << "listen success" << endl;

SOCKET connetionSock;

SOCKADDR_IN clientAddr;
int clientAddrlen = sizeof(clientAddr);

char recvtext[1024] = {'0'};
char sendtext[1024] = {'0'};

while (true) {
connetionSock = accept(ListenSock, (SOCKADDR*)&clientAddr, &clientAddrlen);
if (connetionSock == INVALID_SOCKET) {
cout << "accept error" << endl;
continue;
}
cout << "accept success!client add:" << inet_ntoa(clientAddr.sin_addr) << endl;
if (recv(connetionSock, recvtext, strlen(recvtext), 0) == SOCKET_ERROR) {
cout << "recv error" << endl;
closesocket(connetionSock);
closesocket(ListenSock);
return 0;
}
cout << "recv success!recv's data:" << recvtext << endl;

cout << "input send's data:" << endl;
cin >> sendtext;
if (send(connetionSock, sendtext, strlen(sendtext), 0) == SOCKET_ERROR) {
cout << "send error" << endl;
closesocket(connetionSock);
closesocket(ListenSock);
return 0;
}
cout << "send success" << endl;

closesocket(connetionSock);
}


客户端
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0) {
cout << "wsastartup error" << endl;
return 0;
}
cout << "wsastartup success" << endl;

SOCKET s;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == SOCKET_ERROR) {
cout << "socket error" << endl;
WSACleanup();
return 0;
}
cout << "socket success" << endl;

SOCKADDR_IN serveradd;
serveradd.sin_family = AF_INET;
serveradd.sin_port = htons(5000);
serveradd.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

int rr = connect(s, (SOCKADDR*)&serveradd, sizeof(serveradd));
if (rr = SOCKET_ERROR) {
cout << "connect error:" << rr << endl;
closesocket(s);
WSACleanup();
return 0;
}
cout << "connect success" << endl;
cout << "input \"exit\" can exit this chat" << endl;

char recvbuf[1024] = {'0'};
char sendbuf[1024] = {'0'};

while (true) {
cout << "input send data:" << endl;
cin >> sendbuf;
if (send(s, sendbuf, 1024, 0) == SOCKET_ERROR) {
cout << "send error" << endl;
closesocket(s);
WSACleanup();
return 0;
}
if (!strcmp(sendbuf, "exit")) {
cout << "already exit chat" << endl;
break;
}
cout << "send success" << endl;

int r = recv(s, recvbuf, 1024, 0);
if (r == 0) {
cout << "r==0" << endl;
}
else if (r = SOCKET_ERROR) {
cout << "recv error" << endl;
}
recvbuf[r] = '\0';
if (!strcmp(recvbuf, "exit")) {
cout << "Server already exit chat" << endl;
break;
}
cout << "Server:" << recvbuf << endl;
}


运行结果
打开服务端

打开客户端



希望各路大神能帮忙讲解一下,不胜感激!
...全文
473 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-06-12
  • 打赏
  • 举报
回复
if (rr = SOCKET_ERROR) {
        cout << "connect error:" << rr << endl;
        closesocket(s);
        WSACleanup();
        return 0;
    }
注意看一下if的判断表达式,是不是少一个=,应该是判断表达式,却写成了赋值表达式了吧
棉猴 2018-06-12
  • 打赏
  • 举报
回复
正如1楼所说。
《C++Primer中文版第5版》P129
赋值运算的结果是它左侧运算对象,并且是一个左值。相应的,结果的类型就是左侧运算符的类型。
因此,
if (rr = SOCKET_ERROR)

等价于
if (-1)

故此,无论rr的返回值是多少(是否成功连接),都会显示连接错误!

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧