Linux下怎么实现TCP客户端被动接收服务器端信息在接收到信息以后,自动返回一个值给客户端

Linux下用TCP做一个聊天小程序,结果客户端在使用登录功能再退出后导致服务器也退出
[问题点数:50分,结帖人qq]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:0
本版专家分:370052
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:44590
2018年6月 C/C++大版内专家分月排行榜第二2018年1月 C/C++大版内专家分月排行榜第二2017年12月 C/C++大版内专家分月排行榜第二2017年8月 C/C++大版内专家分月排行榜第二
2018年5月 C/C++大版内专家分月排行榜第三2018年4月 C/C++大版内专家分月排行榜第三2018年3月 C/C++大版内专家分月排行榜第三2018年2月 C/C++大版内专家分月排行榜第三2017年11月 C/C++大版内专家分月排行榜第三2017年10月 C/C++大版内专家分月排行榜第三2017年9月 C/C++大版内专家分月排行榜第三2017年6月 C/C++大版内专家分月排行榜第三2017年5月 C/C++大版内专家分月排行榜第三2017年4月 C/C++大版内专家分月排行榜第三2017年3月 C/C++大版内专家分月排行榜第三
本版专家分:4658
本版专家分:44590
2018年6月 C/C++大版内专家分月排行榜第二2018年1月 C/C++大版内专家分月排行榜第二2017年12月 C/C++大版内专家分月排行榜第二2017年8月 C/C++大版内专家分月排行榜第二
2018年5月 C/C++大版内专家分月排行榜第三2018年4月 C/C++大版内专家分月排行榜第三2018年3月 C/C++大版内专家分月排行榜第三2018年2月 C/C++大版内专家分月排行榜第三2017年11月 C/C++大版内专家分月排行榜第三2017年10月 C/C++大版内专家分月排行榜第三2017年9月 C/C++大版内专家分月排行榜第三2017年6月 C/C++大版内专家分月排行榜第三2017年5月 C/C++大版内专家分月排行榜第三2017年4月 C/C++大版内专家分月排行榜第三2017年3月 C/C++大版内专家分月排行榜第三
本版专家分:347
本版专家分:0
匿名用户不能发表回复!
其他相关推荐扫一扫体验手机阅读
linux 使用c在tcp socket服务器端获取客户端ip
<span type="1" blog_id="1303729" userid='
71篇文章,15W+人气,0粉丝
网络工程师2.0进阶指南
¥51.00129人订阅
容器私有云平台实践之路
¥51.00138人订阅
高并发架构之路
¥51.00171人订阅
前百度高级工程师的架构高可用实战
¥51.00250人订阅
掌握VMware超融合技术
¥51.0087人订阅一、网络中进程之间如何通信?
&&&&&socket一词的起源:在组网领域的首次使用是在日发布的文献中发现的,撰写者为Stephen Carr、Steve Crocker和Vint Cerf。根据美国计算机历史博物馆的记载,Croker写道:&命名空间的元素都可称为套接字接口。一个套接字接口构成一个连接的一端,而一个连接可完全由一对套接字接口规定。&计算机历史博物馆补充道:&这比BSD的套接字接口定义早了大约12年。&
3.3、网络字节序与主机字节序
主机字节序:就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。引用标准的Big-Endian和Little-Endian的定义如下:
  a) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
  b) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
3.4、listen()、connect()函数
SYN表示建立连接,
FIN表示关闭连接,
ACK表示响应,
PSH表示有 DATA数据传输,
RST表示连接重置。
我们知道tcp建立连接要进行&三次握手&,即交换三个分组。大致流程如下:
&&&&&& 只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:
阅读(...) 评论()TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
Tcp的多用户连接:
#include &stdio.h&#include &string.h&#include &unistd.h&#include &ctype.h&#include &sys/socket.h&#include &netinet/in.h&#include &arpa/inet.h&#include &errno.h&#include &stdlib.h&#include &signal.h&#define MAXLINE 800int port = 8000;int main(void){
struct sockaddr_in sin;
struct sockaddr_in pin;
int listen_fd;
int conn_fd;
int sock_fd;
int nready;
int client[FD_SETSIZE];
int address_size = sizeof(pin);
char buf[MAXLINE];
char str[INET_ADDRSTRLEN];
bzero(&sin, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == listen_fd)
perror("call
to socket");
n = bind(listen_fd, (struct sockaddr *)&sin, sizeof(sin));
if (-1 == n)
perror("call
to bind");
n = listen(listen_fd, 20);
if (-1 == n)
perror("call
to listen");
printf("Accepting
connections...\n");
conn_fd = accept(listen_fd, (struct sockaddr *)&pin, &address_size);
n = fork();
if (-1 == n){
perror("call
to fork");
Linux Socket编程:基于TCP/IP的客户端与服务端通讯实例
Linux Socket编程:基于TCP/IP的客户端与服务端通讯实例服务端代码#include
#include i...
MFC Socket TCP
步骤:一、创建CSocket 对象
   二、AfxSocketInit();//在哪个线程就在哪个线程里调用这个
   三、调用Socket()方法,来创建socket句柄
基于socket的TCP、UDP 编程(附带源代码)
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
使用套接字通信的...
TCP的socket的服务器端和客户端实例(linux下)
TCP的socket的服务器端和客户端实例:
1、服务器端步骤:
socket()-&bind()-&listen()-&accept()-&read()-&write()-&close()
基于linux poll模型的tcp服务器------一个服务器如何与多个客户端进行通信?
在之前的博文中, 我们一起玩了Windows下的select函数, 实现了一个服务器与多个客户端进行通信。 如果一直到linux, 那几乎是大同小异的。 现在, 我们不说select,...
tcp客户端与服务端之间的通信实例
假设你只有一台电脑,还不能连接上Internet, 那如何进行网络编程呢?用回测地址吧。
服务端的程序为:...
没有更多推荐了,新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
刚接到一项目,要做一个TCP客户端代理,该代理工作在linux平台上,与服务器最多时有接近1000条tcp连接,并定时发送心跳包以维持TCP连接不中断。现在要求服务器的技术实现不能有任何改动。只能在TCP客户代理上做文章。
目前想了两个方案,如下所示:
1. 在一个进程中通过for循环等方式建立这1000条tcp连接,并采用轮询或select的方式实现其他细节,如心跳包和响应等;
2. 为每一个TCP连接建立一个线程。
方案1,我写了一个简单TCP服务器和客户端程序尝试过,1000条tcp连接通信似乎没有问题,速度也能接受,但总觉得这个方案不够好。
方案2,我认为是理想的方案,但如果真是1000个客户,就要建立1000个线程,这显然也不太合适,开销也巨大。
有没有哪位大侠有更好的方案,在此谢过!
巨富豪门, 积分 30110, 距离下一级还需 9890 积分
论坛徽章:257
只是代理,处理开销小,方案1不是很合适么,有啥不好?
不过一般的代理,应该得接受客户端的连接吧
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
谢谢楼上的热心回复,方案1虽然可行,只是觉得这样实现有点怪异,不符合日常的程序设计。我这个代理工作在基站上,终端与基站是无线连接,终端没有TCP/IP协议栈,基站获取终端的数据后,TCP代理通过串口读取终端的数据,然后将数据传给服务器。
请教高手们,是否还有更好的招?谢谢!
丰衣足食, 积分 804, 距离下一级还需 196 积分
论坛徽章:1
按照你的业务来说,我不知道为什么要千把连接,这里应该只需要有一两个连接就可以了。可以将业务简单的划分业务逻辑为终端数据接收部分,数据发送部分与控制部分。&&
数据发送与数据采集部分完全隔离。
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
本帖最后由 朝歌勇志 于
10:24 编辑
file3 发表于
按照你的业务来说,我不知道为什么要千把连接,这里应该只需要有一两个连接就可以了。可以将业务简单的划分 ...
因为服务器那边的代码不让动,以前最早是在终端上安装上一个GPRS模块,然后每个终端通过GPRS模块与服务器建立单独的、长久的TCP连接。没有业务数据的时候会有心跳包。
现在客户嫌成本过高,想去掉这个GRPS模块,所以我们就搞了一个无线模块替换GPRS模块,并加入一个无线基站,由基站来采集终端的数据,再传给服务器。
由于这个无线模块就是一个单片机,速率不高,还半双工,不带TCP协议栈;而客户又不想改动服务器的代码,所以我们才在基站上来模拟所有终端的TCP连接。基站每接入一个终端,基站就向服务器建立TCP连接,并上报相关信息。一个基站可能接入1000多个终端,所以需要和服务器建立至少1000条TCP连接。
服务器查询终端的情况时,把指令通过TCP连接发给基站,基站收到指令,并找到要询的终端,然后无线下发过去。终端收到指令,准备好数据并传给基站,基站得到数据,找到对应的socket,再发送给服务器,这就是整个流程。
请高手指点!
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用poll模式轮询,同时负责数据分发调度到不同线程;
仅供参考。
白手起家, 积分 7, 距离下一级还需 193 积分
论坛徽章:0
keep_hungery 发表于
1. 启动一个心跳检查线程负责心跳检查
2. 开启几个业务线程池, 负责处理业务处理转发。
3. 主线程采用po ...
谢谢你的建议,我会认真考虑!同时,也恳请各路高手顶立相助,提出宝贵建议,在此叩谢!}

我要回帖

更多关于 客户端被动接收服务器端信息 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信