问题描述
- 网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑
-
拜托各位了,碰上一个难以理解的困惑情况如下
我在qt中编写了一个客户端(抛开qt,也可以理解为别的写的),在这个应用程序中有一个对象是专门用来建立连接并且处理和服务器的相关的通信。服务器的话是在linux下c写的,简单的可以看做这种模式accept等待连接,连接成功后阻塞读写
while(1) {
clientfd = accept(lfd, null, null);
printf("new connectn");
while(1) {
if((n = read(clientfd, buf, 2)) == -1) {
perror("read faild");
close(clientfd);
break;
} else if(n != 2){
printf("not right headn");
continue;
}``` func(buf, fd);//回复客户端
}
}那么问题来了,我不小心在改程序时建立了两个这个对象
对象的层次关系变成如下
主窗体 A
主窗体下两个子窗体 B C(C为用于处理网络的)
而B下又有一个C1(和C是一样的)当程序启动时建立连接客户端向服务器发送某一请求,服务器回复成功,但是我客户端接收数据,但是并未达到我想要的结果,不过这个不是重点;
当我对客户端操作后,客户端会向套接字写数据,
n = tcp->write(```);
qdebuf() << " write num = " << n;
每操作一次,他都会输出写了多少个字节,用抓包工具显示其也确实发生了该数据,但是在服务器却一直阻塞在读的那一步,这个也很好理解,因为他只和某一个地址的某一端口建立了连接,别的端口他也读取不了。这就可以推测出,客户端在操作时其建立连接的对象是C1,而不是C,(因为我是在A中绑定了B,C的槽)操作B时C的槽响应,那真正令人费解的是,C1和C应该只能有一个能建立连接成功,而且从服务器的响应来看他是和C1建立连接了,但是为什么C却每次能写成功?
附上抓包工具抓包的情况分析
![CSDN移动问答][2]
13-18是操作客户端后的,然后没操作一次都客户端都会提示写了19字;但是在服务器端不能读取信息,也就是说建立连接的不是这个端口呗?
1-12是一开始建立连接的时候包的情况,开始建立的时候客户端也给服务器发送了一个数据,服务器接收成功也给他回复了一个