tcp socket 和 socket文件
- tcp socket
tcp socket 是标示了一台主机的进程,是tcp连接中一端的实例。socket不是连接,只是表示了其中一端。由IP和port构成。 - tcp 连接
tcp连接由两台主机上的进程的socket连接构成。
tcp server
为建立tcp连接,扮演server角色的一端进程需要:
- 通过
socket()
系统调用新建一个socket。
sockfd = socket(AF_INET, SOCK_STREAM, 0);
- 给新建的socket绑定IP和port
bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr))
其中serv_addr结构体内包含了IP和port信息。
- 通过
listen()
系统调用监听连接
listen(sockfd,5);
- 通过
accept()
系统调用接收连接
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen)
这里newsockfd是通过accept()
系统调用新建的socket文件描述符。当server监听到连接请求,便用这个新生产的socket与远程client的socket通讯。
完整的程序server.c
server.c
是一个多进程版本的tcp server,当有新的请求时,使用fork()
系统调用产生新进程来处理连接请求:
while (1) {newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);if (newsockfd < 0) error("ERROR on accept");pid = fork(); // 子进程处理连接if (pid < 0)error("ERROR on fork");if (pid == 0) {close(sockfd);dostuff(newsockfd);exit(0);}else close(newsockfd);}
其实也可以用多线程来处理请求,当有新的请求时,使用pthread_create()
调用,产生新线程。详细代码参考 这里。
其实最有效当处理多请求当手段是使用系统epoll
,通过事件通知机制,non-blocking地处理请求。详细代码参考这里
tcp client
为了建立tcp连接,tcp client 做了下面这些事儿:
- 新建socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
- 通过系统调用
connect()
,与远程server监听socket发起连接请求。
connect(sockfd,&serv_addr,sizeof(serv_addr))
- 连接成功后,便可通过向新建的socket中
read()
和write()
来实现通讯了。
n = write(sockfd,buffer,strlen(buffer));
n = read(sockfd,buffer,255);
完整代码client.c
socket 文件
在一切皆文件的Unix-like系统中,进程生产的socket通过socket文件来表示,进程通过向socket文件读写内容实现消息的传递。
在Linux系统中,通常socket文件在/proc/pid/fd
文件下。通过上面的server.c和client.c实践一下,窥探一下对应的socket文件。
先编译server.c和client.c
gcc server.c -o server
gcc client.c -o client
运行在本地30000端口上:
server 30000
用lsof或者netstat查看server进程ID
根据pid(17009),去目录/proc/17009/fd
下查看:
其中socket:[1293853508]
便是socket文件。
运行client,连接到server上。
client localhost 30000
先不要发送消息,保持连接。然后通过 lsof命令查看30000端口:
看图中NAME这一列,其中
第一行,*:30000是server到监听socket文件名
第二行,localhost:57684->localhost:30000 (ESTABLISHED)是client端端socket文件名
第三行,localhost:30000->localhost:57684 (ESTABLISHED)是server 端为client端的请求建立的新的socket,负责和client通信
Unix Domain socket
上述所说的socket是internet domain socket,用于不同主机之间进程的通信。在Unix中,本机之间进程通信通常用另外一种socket( Unix domain socket)。新建Unix domain socket 连接和 internet domain socket 连接几乎上差不多,唯一的区别就是socket()
系统调用时传入socket type 不同而已。
sockfd = socket(AF_UNIX,SOCK_STREAM,0
注意这里的 AF_UNIX 和 上面的AF_INET 区别。
Unix socket server程序userver.c
Unix socket client程序uclient.c
编译:
gcc userver.c -o userver
gcc uclientj.c -o uclient
userver 接收一个参数,用于创建socket文件,参数便是socket文件的名字。比如用 /tmp/usfd
作为socket文件。
userver /tmp/usfd
查看一下新生产的socket文件:
ls -l /tmp/usfd
该文件的mode string的第一个字符s
表示这是一个socket文件。
tcp socket 和 socket文件相关推荐
- 【Java】TCP Socket编程案例——文件传输聊天工具
TCP(传输控制协议)是面向连接的可靠数据传输协议.TCP连接一旦建立起来,一直占用,直到关闭连接.另外,TCP为了保证数据的正确性,会重发一切没有收到的数据,还会对数据内容进行验证,并保证数据传输的 ...
- 基于TCP协议的Socket通信,实现文件断点续传
代码示例: 实现文件断点续传 先编写一个服务端和客户端都会用到的流解析类: StreamTool.java: public class StreamTool {public static void s ...
- Socket实现简单文件传输(TCP)
客户端 //客户端的输出流对应服务端的输入流 客户端的输入流对应服务端的输出流 public class TCPClient {public static void main(String[] arg ...
- 基于TCP(面向连接)的Socket编程
基于TCP(面向连接)的Socket编程 一.客户端: 1.打开一个套接字(Socket); 2.发起连接请求(connect); 3.如果连接成功,则进行数据交换(read.write.send.r ...
- Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程
目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...
- Linux IPC udp/tcp/UNIX域 socket编程
UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的 ...
- HTTP,FTP,TCP,UDP及SOCKET
一.TCP/IP协议简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传输层:TCP协议与UDP协议 应 ...
- java socket ip_JAVA 网络编程 TCP/IP、Socket 和协议设计
[JAVA 网络编程 TCP/IP.Socket 和协议设计] TCP/IP 协议简介 IP 首先我们看 IP(Internet Protocol)协议.IP 协议提供了主机和主机间的通信. 为了完成 ...
- c语言linux TCP长连接 socket收发范例 断开自动重连
原文链接:https://blog.csdn.net/chenhao0568/article/details/103420615 c语言linux TCP长连接 socket收发范例 断开自动重连 改 ...
最新文章
- html中js添加或删除activex,JS:操作样式表2 :用JS实现添加和删除一个类名的功能(addClass()和removeClass())...
- jQuery源码解读
- python字符串解释_python基础之字符串详解
- linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”
- 综述之我的十年本硕博生活
- 每天学一点flash(75) ToolTip 提示
- Android 动态创建控件并设置控件的大小之Android屏幕适配攻略(五)
- 在Oracle/SQL Service中通过Function返回Table
- bash 不是内部或外部命令_Python安装时提示“Python不是内部或外部命令...”解决方法...
- MATLAB周期时域曲线,matlab时域采样定理
- 报价单常见问题及高效拯救你的报价实用手册
- iphone个系列尺寸_iphone各机型尺寸
- 一篇解析论文MapReduce
- JavaScript实现鼠标点击监听---弹出社会主义核心价值观(面向对象小练习)
- matlab hdf5,无法使用最新的HDF5打开matlab文件
- 基于关联规则的足球比赛数据分析
- 查全率和查准率有什么区别?
- NAXX Demo3_JSQ_03
- 关于eMule下载伤硬盘的话题(官方解释)
- (六) kityminder 协同编辑执行用例时,如果做到不相互干扰
热门文章
- 报错Content type ‘multipart/form-data;boundary=----WebKitFormBoundaryTz0sivpVO7U0H70m;charset=UTF-8‘ n
- linux实验实训报告,linux实验实训报告.doc
- linux 解压所有以zip结尾的文件_Linux下的压缩zip,解压缩unzip命令详解及实例
- 不干胶标签的印刷工艺
- pythondis功能_python中dis的用法
- java泛型 方法返回值带有泛型 <T>
- 克隆VirtualBox里的系统
- 基于RGB-D数据的语义建图
- 汇编语言 | CALL 和RET指令
- 二分 1238:一元三次方程求解