Linux TCP server 只能接受一个 TCP 连接
#include <stdio.h> #include <sys/types.h>
#include <sys/socket.h> #include <string.h> // menset 函数
#include <stdlib.h> // exit 函数 #include<netinet/in.h> // struct sockaddr_in 结构类型 #include<arpa/inet.h> // inet_ntoa 函数 #include <unistd.h> // close 函数 int tcpServerInit( void ); void main()
{
//2017年11月28日11:18:18,suozhang,add
printf("2017年11月28日11:18:39,hello,world!\r\n"); tcpServerInit(); } int tcpServerInit( void )
{
// AF_INET : IPV4网络协议
// SOCK_STREAM : 提供双向连续且可信赖的数据流,即TCP,支持OOB机制,在所有数据传输前必须使用connect()来建立连接状态
// 0 : 用来指定socket所使用的传输协议编号,通常此参考不用管他,设为0即可
int tcpServerSocket = socket(AF_INET, SOCK_STREAM, ); if(tcpServerSocket < )
{
// 创建 socket 失败
// perror(s) 用来将上一个函数发生错误的原因输出到标准设备(stderr)。
perror("new tcpServerSocket error is "); //exit(-1)表示程序异常退出
exit(-);
} //定义 服务器 IP地址和端口号 结构体变量
struct sockaddr_in tcpServerAddr; //将结构体清空
memset(&tcpServerAddr,,sizeof(tcpServerAddr)); tcpServerAddr.sin_family = AF_INET; // AF_INET : IPV4网络协议 // htons() 函数用来将 16位 类型 转换为 网络字符顺序
tcpServerAddr.sin_port = htons();// 绑定端口号为9527,通常是大于1024的一个值 // inet_addr() 函数用来将IP地址字符串转换成网络所使用的二进制数字
tcpServerAddr.sin_addr.s_addr = inet_addr("10.1.51.53");// 这里可填写 INADDRY_ANY 表示服务器自动填充本机IP地址 if( bind(tcpServerSocket, (struct sockaddr*)&tcpServerAddr, sizeof(tcpServerAddr)) < )
{
//绑定失败
perror("bind tcpServerSocket err is "); close( tcpServerSocket ); //绑定失败,因此关闭创建的 socket //exit(-1)表示程序异常退出
exit(-);
} printf("TCP server ip: %s and port: %d.\r\n", inet_ntoa(tcpServerAddr.sin_addr), ntohs(tcpServerAddr.sin_port)); //监听socket ,第二个参数规定了内核应该为相应套接口排队的最大连接个数。
if( listen(tcpServerSocket, ) < )
{
//监听失败
perror("listen tcpServerSocket err is "); close( tcpServerSocket ); //绑定失败,因此关闭创建的 socket //exit(-1)表示程序异常退出
exit(-);
} struct sockaddr_in tcpClientAddr; //将结构体清空
memset(&tcpClientAddr,,sizeof(tcpClientAddr)); socklen_t tcpClientAddrLen = sizeof(struct sockaddr); // accept() 函数 接受远程计算机的连接请求,建立与客户机之间的通信连接。
// 服务器处于监听状态时,如果某时刻获得客户机的连接请求,此时并不是立即处理这个请求,
// 而是将这个请求放在等待队列中,当系统空闲时再处理客户机的连接请求。
// 重点: 当 accept() 函数接受一个连接时,会返回一个新的socket标识符,
// 以后的数据传输和读取就要通过这个新的socket编号来处理,
// 原来参数的socket(这里指 tcpServerSocket )也可以继续使用,继续监听其他客户机的连接请求
// 因此 服务器跟一个客户端连接成功,就会产生两个套接字,一个当初自己创建的,一个 accept() 创建的 int tcpClientSocket = accept(tcpServerSocket, (struct sockaddr*)&tcpClientAddr, &tcpClientAddrLen); if( tcpClientSocket < )
{
perror("accept tcpServerSocket err is "); close( tcpServerSocket ); //绑定失败,因此关闭创建的 socket //exit(-1)表示程序异常退出
exit(-);
}
else
{
printf("connected with ip: %s and port: %d.\r\n", inet_ntoa(tcpClientAddr.sin_addr), ntohs(tcpClientAddr.sin_port));
} char buf[] ={ }; for( ;; )
{
if( recv( tcpClientSocket, buf, sizeof( buf ), ) < )
{
perror("recv tcpClientSocket err is "); close( tcpServerSocket ); //绑定失败,因此关闭创建的 socket close( tcpClientSocket ); //绑定失败,因此关闭创建的 socket //exit(-1)表示程序异常退出
exit(-);
} printf("接收的数据是:%s.\r\n",buf); //将接收的数据发回客户端
if( send( tcpClientSocket,buf,strlen(buf), ) < )
{
perror("send tcpClientSocket err is "); close( tcpServerSocket ); //绑定失败,因此关闭创建的 socket close( tcpClientSocket ); //绑定失败,因此关闭创建的 socket //exit(-1)表示程序异常退出
exit(-);
} //将接收缓冲区清空
memset(buf,,sizeof(buf)); } }
Linux TCP server 只能接受一个 TCP 连接的更多相关文章
- 一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接
一个支付宝小程序在一段时间内只能保留一个 WebSocket 连接 my.connectSocket - 支付宝开放平台 https://opendocs.alipay.com/mini/api/vx ...
- 解决Linux 下server和client 通过TCP通讯:accept成功接收却报错的问题
今天在写简单的TCP通讯例子的时候,遇到了一个问题:server 和client能够连接成功,并且client也能够正常发送,但server就是接收不到,在网上搜索一番后,终于解决了问题.在这里整理如 ...
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- Linux高性能server规划——处理池和线程池
进程池和线程池 池的概念 由于server的硬件资源"充裕".那么提高server性能的一个非常直接的方法就是以空间换时间.即"浪费"server的硬件资源.以 ...
- Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结
Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...
- TCP server 为什么一个端口可以建立多个连接?
https://segmentfault.com/q/1010000003101541 如果是tcp client用同一个本地端口去连不同的两个服务器ip,连第二个时就会提示端口已被占用.但服务器的监 ...
- 【Python】如何基于Python写一个TCP反向连接后门
首发安全客 如何基于Python写一个TCP反向连接后门 https://www.anquanke.com/post/id/92401 0x0 介绍 在Linux系统做未授权测试,我们须准备一个安全的 ...
- [转]一个基于完成端口的TCP Server Framework,浅析IOCP
[转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...
- 用qemu+gdb tcp server+CDT调试linux内核启动-起步
用qemu+gdb tcp server+CDT调试linux内核启动-起步 说明: 环境信息与 用virtualbox+模拟串口+CDT调试linux内核 TCP IP协议栈-起步 提到的一样,并且 ...
随机推荐
- javascript函数中with的介绍
/*js函数中with函数的用法分析定义 方便用来引用某个对象中已有的属性但是不能用来给对象添加属性 要给对象创建新的属性 必须明确的引用该对象*/代码格式with(object) statement ...
- codechef Many Lists(树状数组 set)
题意 题目链接 Sol 直接做肯定不好搞(反正我不会..) 直接开\(n\)个Pair类型的set,维护每个数的出现位置 每次在set中二分后暴力合并即可 然后就是树状数组的基本操作了 时间复杂度:\ ...
- Python 批量修改文件夹名称
修改为: # -*- coding: utf-8 -*- import os, sys,re path=u"E:\\C#网络编程基础" dirs=os.listdir(path) ...
- AngularJS+RequireJs实现动态加载JS和页面的方案研究【下】
about.js: [html] view plain copy 在CODE上查看代码片派生到我的代码片 define(['app'], function(app) { app.controller( ...
- 一步一步pwn路由器之路由器环境修复&&rop技术分析
前言 本文由 本人 首发于 先知安全技术社区: https://xianzhi.aliyun.com/forum/user/5274 拿到路由器的固件后,第一时间肯定是去运行目标程序,一般是web服务 ...
- AndroidStudio中logcat不输出信息
2017年11月27日,记住这个日子.今天第一次感觉到被批评了,由于自己技术知识储备不足导致今天的外出工作等于浪费时间.正式因为这个logcat不输出信息的问题,前几回不输出信息了我就从新启动了开发工 ...
- Android链接蓝牙电子称
蓝牙一直是我内心屏蔽的一个模块哈哈哈哈!然而今天我不得不正视它了,我百度了看了好多因为需要设备匹配所以设备不在没办法测试,几天之后设备到了.因为没有接触过,看到返回的打印出来的菱形方块就以为是错了.于 ...
- sql大数据多条件查询索引优化
此优化的前提可以称之为最近流行的头条人物“许三多”,总数据多,查询条件多,返回列多 优化前分页查询内部select列为需要的全部列,优化后内部select只返回ID主键,外部查询关联原数据表,然后查出 ...
- 在 Windows Server Container 中运行 Azure Storage Emulator(二):使用自定义的 SQL Server Instance
上一节,我们解决了 Azure Storage Emulator 自定义监听地址的问题,这远远不够,因为在我们 DEV/QA 环境有各自的 SQL Server Instance,我们需要将 ASE ...
- Windows系统通用安全配置基线
一:共享账号检查 配置名称:账号分配检查,避免共享账号存在 配置要求: 1.系统需按照实际用户分配账号: 2.根据系统的使用需求,设定不同的账户和账户组,包括管理员用户,数据库用户,审计用户,来宾用户 ...