作者airawesu ()
看板C_and_CPP
标题[问题] socket程式 自己输入IP後client卡住
时间Sat Nov 19 12:43:28 2016
开发平台(Platform): (Ex: Win10, Linux, ...)
VS 2015
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
C++ WIN32主控台应用程式
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
client:
#include <iostream>
#include <string>
using namespace std;
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
server:
#include <iostream>
using namespace std;
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
问题(Question):
我写了一对socket的小程式
client利用server的IP跟port来通讯
client在连线後输入任意字元 server收到之後回传给client
client显示server的回传
原程式运作OK 现client增新宣告及新程式段
char IP_char[17];
cout << "please key in IP:";
cin >> IP_char;
cout << "\n"; //换行
原serverIP宣告 servAddr.sin_addr.s_addr = inet_addr("36.227.47.199");
改为 servAddr.sin_addr.s_addr = inet_addr(IP_char);
另持续给使用者输入文字用程式段的while回圈为
while(1) {
ZeroMemory(str, BUF_SIZE);
cout << "you key in :";
cin.getline(str, BUF_SIZE);
//向服务器发送数据
ZeroMemory(buf, BUF_SIZE);
strcpy_s(buf, str);
retVal = send(sHost, buf, strlen(buf), 0);
if (SOCKET_ERROR == retVal) {
cout << "send failed!\n";
closesocket(sHost); //关闭Socket
WSACleanup(); //释放Socket资源
system("pause");
return -1;
}
cout <<"server echo : ";
retVal = recv(sHost, buf, BUF_SIZE, 0);
cout << buf << endl; //输出由Server端传送的字串
if (!strcmp(buf,"bye")) break;
}
最後发现cin.getline的指令疑似被略过
client及server端变成如图片
http://i.imgur.com/31lho1j.jpg
http://i.imgur.com/1gy0EDA.jpg
喂入的资料(Input):
预期的正确结果(Expected Output):
please key in IP:36.227.47.199
you key in :hello world
server echo:hello world
错误结果(Wrong Output):
如上
程式码(Code):(请善用置底文网页, 记得排版)
http://ideone.com/rbt8e7
http://ideone.com/YIvrfH
补充说明(Supplement):
请鞭小力点(跪
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.227.47.199
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1479530614.A.0D8.html
※ 编辑: airawesu (36.227.47.199), 11/19/2016 12:44:57
1F:→ Schottky: 会不会是卡在 connect,server 连不上11/19 13:29
2F:推 Qbsuran: 先用wireshark看连线有没有正常送出11/19 17:51
3F:→ Schottky: socket 出问题不一定是出在程式上11/19 18:05
4F:→ Schottky: wireshark 或 tcpdump 之类的 sniffer 确实会有需要11/19 18:06
5F:推 fanntone: 你应该是参考网路上XYZ那篇写的 先把main一开始就包进11/19 21:25
6F:→ fanntone: while回圈就可以一直输入了11/19 21:26
我很确定SERVER可以连上
把整个main内的程式都包进去吗 我现在还不行Q_Q
※ 编辑: airawesu (36.227.47.199), 11/19/2016 23:17:40
现在可以了 不修改while回圈位置
我把cin>>IP_char;
改成cin.getline(IP_char,17);
功能就OK了 可正常使用
但有大神知道这是为什麽吗
http://i.imgur.com/g6FJh0w.jpg
※ 编辑: airawesu (36.227.47.199), 11/19/2016 23:27:01
7F:推 johnpage: 数值与字串11/20 06:08
我蠢透了
※ 编辑: airawesu (114.136.26.93), 11/20/2016 08:59:22