新手请教socket通讯问题

没味儿 2017-11-22 07:27:43
服务端
void recvdata(...)
{
int count = 0; // 记数器
CString sCount = "" // 打印记数器数据
while(1)
{
DataBlag data = {0}; // 数据包结构体
::recv(sock, (LPTSTR)&data, sizeof(data), 0);
if( data.ID == USERLOGIN) // 如果是登陆请求
{
DataBlag dataSend = {0};
dataSend.res = TRUE;
::send(sock, (LPCTSTR)&data, sizeof(data), 0); // 回就允许登陆
}
sCount.Format("%d", ++count);
GetDlgItem(IDC_STATIC)->SetWiindowText(sCount) // 打印到界面上循环体运行次数
}
}

客户端是
{
::send(登陆请求);
::recv(请求回应);
}

问题是:
1.服务端正确收到了客户端的请求,作了回应,但是客户端没能收到回应, 只有把服务端关闭才能收的到。
2.服务端和客户端在同一机子运行测试,服务端绑定的地址是127.0.0.1 客户端向127.0.0.1连接则能成功 向192.168.0.10(本机实制IP)则不能成功,不知道为什么
3.如上面代码所示,客户端只向服务端发送一次数据,而服务端循环体内的记数器往界面打印一个34的数字。据我的理解是recv没数据收时,是保持阻塞状态,那么记数器打印的应该是1 不知道我的理解是否有误呢?
4.如果客户端正常退出和非正常退出而失去连接(如:如拔网线)服务端的套接字会有什么状态上的变化的吗?

脆求大神飘过....
...全文
295 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
没味儿 2017-11-23
  • 打赏
  • 举报
回复
问题已解决了,大意传参的低级错误。
没味儿 2017-11-22
  • 打赏
  • 举报
回复
引用 1 楼 cvbtvbwu 的回复:
代码太少,分析不了原因,可以联系我。
全部代码太多,基本流程就是这样的。数据传送内容什么都是正确的,就是要关了服务器,客户端才能收得到服务器的回应,否则就是一直在阻塞。
没味儿 2017-11-22
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
先看看::recv(sock, (LPTSTR)&data, sizeof(data), 0); 这里接收的数据是什么,是否符合你的处理预期
服务端的recv收到的数据是符合的,就是要关了服务端,客户端才能收得到服务端的回应(回应是正确的)。
oyljerry 2017-11-22
  • 打赏
  • 举报
回复
先看看::recv(sock, (LPTSTR)&data, sizeof(data), 0); 这里接收的数据是什么,是否符合你的处理预期
赵4老师 2017-11-22
  • 打赏
  • 举报
回复
学会使用抓包软件wireshark
叶恭介叶恭介 2017-11-22
  • 打赏
  • 举报
回复
代码太少,分析不了原因,可以联系我。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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