服务器-网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑

问题描述

网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑

拜托各位了,碰上一个难以理解的困惑

情况如下
我在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是一开始建立连接的时候包的情况,开始建立的时候客户端也给服务器发送了一个数据,服务器接收成功也给他回复了一个

时间: 2024-09-12 16:48:20

服务器-网络编程中并未建立连接的端口却能往套接字中写,发送数据,困惑的相关文章

Java网络编程从入门到精通(16):客户端套接字(Socket)的超时

客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象.在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误: 其中客户端所等待的时间就是超时时间. 由于生产超时错误的一端都是被动端:也就是说,这一端是在接收数据,而不是发送数据.对于客户端Socket来说,只有两个地方是在接收数据:一个是在连接服务器时:另一个是在连接服务器成功后,接收服务器发过来的数据时.因此,客户端超时也分为两种

java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据

问题描述 java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据 java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据 解决方案 servlet运行在容器中,如tomcat等等,你可以创建一个javaweb工程,打包成war包之后,部署到tomcat,就可以使用servlet来做请求和响应了. 请关注 : http://git.oschina.net/wangkang/llsfw 希望能够帮到你.

服务器-网络编程新手求指导---客户端为何write()始终返回0

问题描述 网络编程新手求指导---客户端为何write()始终返回0 在本机上做实验,客户端输入文字在服务器端显示 客户端 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <errno.h> #inclu

windows和linux套接字中的select机制浅析

先来谈谈为什么会出现select函数,也就是select是解决什么问题的? 平常使用的recv函数时阻塞的,也就是如果没有数据可读,recv就会一直阻塞在那里,这是如果有另外一个连接过来,就得一直等待,这样实时性就不是太好. 这个问题的几个解决方法:1. 使用ioctlsocket函数,将recv函数设置成非阻塞的,这样不管套接字上有没有数据都会立刻返回,可以重复调用recv函数,这种方式叫做轮询(polling),但是这样效率很是问题,因为,大多数时间实际上是无数据可读的,花费时间不断反复执行

这两个程序怎么改,建立连接,端口为8888

问题描述 packagecom.shengsiyuan.server;importjava.awt.Color;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.ArrayList;importjavax.swing.JOptionPane;importcom

UNIX网络编程:shutdown与close函数的区别

假设server和client 已经建立了连接,server调用了close, 发送FIN 段给client(其实不一定会发送FIN段,后面再说),此时server不能再通过socket发送和接收数据,此时client调用read,如果接收到FIN 段会返回0,但client此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而server收到数据后应答一个RST段,表示服务器已经不能接收数据,连接重置,client收到RST段

C#网络编程(基本概念和操作)

引言 C#网络编程系列文章计划简单地讲述网络编程方面的基础知识,由于本人在这方面功力有限,所以只 能提供一些初步的入门知识,希望能对刚开始学习的朋友提供一些帮助.如果想要更加深入的内容,可以 参考相关书籍. 本文是该系列第一篇,主要讲述了基于套接字(Socket)进行网络编程的基本概念,其中包括TCP协议 .套接字.聊天程序的三种开发模式,以及两个基本操作:侦听端口.连接远程服务端:第二篇讲述了一 个简单的范例:从客户端传输字符串到服务端,服务端接收并打印字符串,将字符串改为大写,然后再将 字符

Java网络编程从入门到精通

Hibernate从入门到精通(十一)多对多双向关联映射 Hibernate从入门到精通(十)多对多单向关联映射 Hibernate从入门到精通(九)一对多双向关联映射 Hibernate从入门到精通(八)一对多单向关联映射 Hibernate从入门到精通(七)多对一单向关联映射 Hibernate从入门到精通(六)一对一双向关联映射 Hibernate从入门到精通(五)一对一单向关联映射 Hibernate从入门到精通(四)基本映射 Hibernate从入门到精通(三)Hibernate配置文

Windows Sockets网络编程(三) WINDOWS SOCKETS 1.1 程序设计

一.简介 WINDOWS SOCKETS是从 Berkeley Sockets 扩展而来的,其在继承 Berkeley Sockets的基础上,又进行了新的扩充.这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制. WINDOWS SOCKETS由两部分组成:开发组件和运行组件. 开发组件:WINDOWS SOCKETS 实现文档.应用程序接口(API)引入库和一些头文件. 运行组件:WINDOWS SOCKETS 应用程序接口的动态链接库(WINSO