思路 主线程负责发送消息,另一线程负责接收消息.服务端和客户端均是如此. 注意 当A方close掉用于通信的socket端口后,该端口是不会立即关闭的.因为此时可能B方的信息还没send完.因此,此时A方的recv仍旧处于阻塞状态,会最后再等待收一次信息.此时,当B方send一个信息给A后,A方recv到后,A的socket端口就正式关闭了,A的recv返回-1. 此时由于A的socket端口已关闭,因此B得recv返回0. 注意区分,如果是这样的代码:如果A方close掉socket端口后,A…
面向连接的TCP程序设计 基于TCP的程序开发分为服务器端和客户端两部分,常见的核心步骤和流程: 其实按照上面这个流程调用系统API确实可以完全实现应用层程序的开发,一点问题没有.可随着时间的推移,你会觉得这样子的开发毫无激情.为什么TCP的开发就要按照这样的流程来呢?而且一般出的问题几乎都不在这几个系统调用上,原因何在?当我们弄清网络开发的本质,协议栈的设计原理.数据流向等这些问题的答案也就会慢慢浮出水面了.接下来这几篇博文主要是围绕网络编程展开,目的是引出后面对于Linux下TCP/IP协议…
通过上一篇博客的学习,你应该对基于epoll的事件触发机制有所掌握,并且通过阅读sio.c/sio.h应该也学会了如何封装epoll以及如何通过设计令epoll更加实用(用户回调,用户参数). 简单回顾一下sio.h中的关键接口,我们接下来将会基于”sio事件触发层“来实现更加上层的“sio_stream(TCP)层”,“sio_dgram(UDP)层”,这种分层设计对于任何架构与程序设计都是非常普遍且有效的. 在sio层, 1,我们可以注册一个fd,提供一个事件回调函数和一个用户参数: str…
摘要:     本文简介了TCP面向连接理论知识,具体讲述了TCP报文各个字段含义.并从Wireshark俘获分组中选取TCP连接建立相关报文段进行分析. 一.概述     TCP是面向连接的可靠传输协议,两个进程互发数据之前须要建立连接,这里的连接仅仅只是是端系统中分配的一些缓存和状态变量,中间的分组交换机不维护不论什么连接状态信息. 连接建立整个步骤例如以下(即三次握手协议): 首先,客户机发送一个特殊的TCP报文段: 其次,server用还有一个特殊的TCP报文段来响应: 最后,客户机再用…
一.tcp协议格式 二.三次握手 在 TCP/IP 协议中.TCP 协议提供可靠的连接服务,採用三次握手建立一个连接. 第一次握手:建立连接时,client发送 syn 包(tcp协议中syn位置1.序号为J)到server,并进入 SYN_SEND 状态.等待server确认: 第二次握手:server收到 syn 包,必须确认客户的 SYN,同一时候自己也发送一个 SYN 包,即 SYN+ACK包(tcp协议中syn位置1,ack位置1.序号K,确定序号为J+1),此时server进入 SY…
一.服务端 1.创建套接字: int socket(int domain, int type, int protocol); domain:指定协议族,通常选用AF_INET. type:指定socket类型,TCP通信下使用SOCK_STREAM. protocol:指定协议,通常为0. 返回值:成功则返回新socket的文件描述符,失败返回-1. 头文件:sys/socket.h     sys/types.h 2.绑定套接字 int bind(int sockfd, struct sock…
具体生成动态库的操作及使用该动态库的操作请参见上篇博文.以下仅仅列出改进版本的代码. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKET_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys…
引言 每次使用socket通信,都会有很对相似的操作.本文,会对TCP与UDP通信做一简单封装,并生成动态库. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKET_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #in…
(1)函数socket /**************************************************************** ** 功能:创建一个套接字用于通信 ** 参数:domain 指定通信协议族 ** type 指定socket类型,流式套接字 SOCK_STREAM ** 数据报套接字 SOCKDGRAM ** 原始套接字 SOCKRAW ** protocol 协议类型 (习惯上填写0) ** 返回值:成功返回非负整数,它与文件描述符类似,我们把它称为…
需求 当客户端连接上服务器后,服务器会将相应文件传输给客户端,实现文件下载. 思路 服务器端,主进程负责listen.循环内,主进程每从任务请求队列中accept出一个请求,就fork出孙子完成文件传输.注意:如果只是fork出儿子,那么主进程就得wait儿子,这样的话,只有当给一个客户端传完文件后才能下一个. 代码 server端 /************************************************************************* > File…