TCP套接字编程

TCP交互流程

https://blog.csdn.net/yansmile1/article/details/53668735

服务器端

创建socket

int socket(int family, int type, int protocol); 
返回套接字描述符,失败返回-1

domain(family) 协议域(协议族),协议族决定了socket的地址类型
(1)AF_INET         IPv4因特网域  
(2)AF_INET6        IPv6因特网域  
(3)AF_UNIX         Unix域  
(4)AF_ROUTE        路由套接字  
(5)AF_KEY          密钥套接字  
(6)AF_UNSPEC       未指定  

type确定socket的类型,常用类型如下:  
(1)SOCK_STREAM     有序、可靠、双向的面向连接字节流套接字  
(2)SOCK_DGRAM      长度固定的、无连接的不可靠数据报套接字  
(3)SOCK_RAW        原始套接字  
(4)SOCK_SEQPACKET  长度固定、有序、可靠的面向连接的有序分组套接字  

protocol指定协议,常用取值如下:  
(1)0               选择type类型对应的默认协议  
(2)IPPROTO_TCP     TCP传输协议  
(3)IPPROTO_UDP     UDP传输协议  
(4)IPPROTO_SCTP    SCTP传输协议  
(5)IPPROTO_TIPC    TIPC传输协议  

问题

  • socket地址类型是什么?
  • <UNP>中AF_LOCAL和博客中的AF_UNIX有什么区别?

bind函数

调用函数 socket 创建套接字描述符时,该套接字描述符是存储在它的协议族空间中,没有具体的地址,要使它与一个地址相关联,可以调用函数bind 使其与地址绑定。客户端的套接字关联的地址一般可由系统默认分配,因此不需要指定具体的地址。若要为服务器端套接字绑定地址,可以通过调用函数 bind 将套接字绑定到一个地址。下面是该函数的描述:

#include <sys/socket.h>   
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);   
sockfd 为套接字描述符
addr是一个指向特定协议地址结构的指针
addrlen是地址结构的长度

struct sockaddr_in {
  sa_family_t  sin_family; /* address. family: AF_INET*/
  in_port_t  sin_port; ./* port in network byte order*/
  struct in_addr sin_addr; /* internet address */
};
/* Internet address.*/ 
struct in_addr {
  uint32_t  s_addr ;  /* address in network byte order */
};

对于 TCP 协议,调用 bind 函数可以指定一个端口号,或指定一个 IP 地址,也可以两者都指定,还可以都不指定。若 TCP 客户端或服务器端不调用bind 函数绑定一个端口号,当调用connect 或 listen 函数时,内核会为相应的套接字选择一个临时端口号。一般 TCP 客户端使用内核为其选择一个临时的端口号,而服务器端通过调用bind 函数将端口号与相应的套接字绑定。进程可以把一个特定的 IP 地址捆绑到它的套接字上,但是这个 IP 地址必须属于其所在主机的网络接口之一。对于 TCP 客户端,这就为在套接字上发送的 IP 数据报指派了源 IP 地址。对于 TCP 服务器端,这就限定该套接字只接收那些目的地为这个 IP 地址的客户端连接。TCP 客户端一般不把 IP 地址捆绑到它的套接字上。当连接套接字时,内核将根据所用外出网络接口来选择源 IP 地址,而所用外出接口则取决于到达服务器端所需的路径。若 TCP 服务器端没有把 IP 地址捆绑到它的套接字上,内核就把客户端发送的 SYN 的目的 IP 地址作为服务器端的源 IP 地址

在地址使用方面有下面一些限制:
  • 在进程所运行的机器上,指定的地址必须有效,不能指定其他机器的地址;
  • 地址必须和创建套接字时的地址族所支持的格式相匹配;
  • 端口号必须不小于1024,除非该进程具有相应的特权(超级用户);
  • 一般只有套接字端点能够与地址绑定,尽管有些协议允许多重绑定;
sockaddr 与sockaddr_in的区别

https://blog.csdn.net/qingzhuyuxian/article/details/79736821

listen函数

#include <sys/socket.h>   
int listen(int sockfd, int backlog);//若成功则返回0,若出错则返回-1;   

sockfd是套接字描述符;  
backlog是该进程所要入队请求的最大请求数量;  

connect函数

#include <sys/socket.h>     
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);   

说明:  
sockfd是系统调用的套接字描述符,即由socket函数返回的套接字描述符
servaddr是目的套接字的地址,该套接字地址结构必须包含目的IP地址和目的端口号,即想与之通信的服务器地址
addrlen是目的套接字地址的大小
如果sockfd没有绑定到一个地址,connect会给调用者绑定一个默认地址,即内核会确定源IP地址,并选择一个临时端口号作为源端口号

accept函数

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回值:若成功返回套接字描述符,出错返回-1;   

说明:
参数 cliaddr 和 addrlen 用来返回已连接的对端(客户端)的协议地址
该函数返回套接字描述符,该描述符连接到调用connect函数的客户端
这个新的套接字描述符和原始的套接字描述符sockfd具有相同的套接字类型和地址族,而传给accept函数的套接字描述符sockfd没有关联到这个链接, 而是继续保持可用状态并接受其他连接请求
若不关心客户端协议地址,可将cliaddr和addrlen参数设置为NULL,否则,在调用accept之前,应将参数cliaddr设为足够大的缓冲区来存放地址, 并且将addrlen设为指向代表这个缓冲区大小的整数指针
accept函数返回时,会在缓冲区填充客户端的地址并更新addrlen所指向的整数为该地址的实际大小
若没有连接请求等待处理,accept会阻塞直到一个请求到来

close函数

#include <unistd.h>   
int close(int sockfd);   
若成功则返回0,若出错返回-1 ;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354