#include <sys/socket.h>
int socket(int family, int type, int protocol)
功能: 创建用于通信的套接字,并指定期望的通信协议类型。
返回: 成功 -> 非负描述字,出错 -> -1
family: 通信协议类型,AF_INET(IPv4协议),AF_INET6(IPv6协议),AF_LOCAL(Unix域协议), AF_ROUTE(路由套接口),AF_KEY(密钥套接口)。
type: 套接口的类型,SOCK_STREAM(字节流套接字), SOCK_DGRAM(数据报套接字),SOCK_RAW(原始套接字)。
protocol: 一般设为0,除非用在原始套接口上。
socket函数成功时返回一个很小的非负整数值,称为套接口描述字socket descriptor,简称套接字sockfd。

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen)
功能: 创建一个与TCP服务器的连接。
返回: 成功 -> 0, 出错 -> -1
sockfd: 由socket函数返回的套接口描述字。
servaddr: 指向套接口地址结构的指针,含有服务器的IP地址和端口号。
addrlen: 套接口地址机构的长度。
出错情况:
1. TCP客户没有收到SYN分节的响应,返回ETIMEDOUT。提示信息:connect error: Connection timed out.
2. 服务器主机在我们指定的端口上没有进程在等待与之连接,称为硬错(hard error)。客户会接口到SYN的响应RST,返回ECONNREFUSED。提示信息:connect error: Connection refused。
3. 客户发出的SYN在中间的路由器上引发了一个目的地不可到达的ICMP错误,称为软错(soft error),返回EHOSTUNREACH或ENETUNREACH。提示信息:connect error: No route to host。
客户调用函数connect之前,不必非得调用函数bind,因为有必要的话,内核会选择源IP地址和一个临时的端口。
如果函数connect调用失败,则套接口不可再用,必须关闭,重新调用socket,然后才能调用函数connect。

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen)
功能: 给套接口分配一个本地协议地址。
返回: 成功 -> 0, 出错 -> -1。
sockfd: 目标套接口描述字。
myaddr: 指向特定于协议的地址机构指针, 该结构中有IP地址和端口信息,也可以两者都不指定。
addrlen: myaddr指向的地址结构的长度。
如果TCP服务器不把IP地址捆绑到接口上,内核就把客户所发SYN所在分组的目的IP地址作为服务器的源IP地址。
若指定端口号为0,调用函数bind时,内核选择一个临时端口。
若指定通配IP地址,则直到套接口已连接(TCP)或数据报已在套接口上发出(UDP),内核才选择一个本地IP地址。
对于IPv4,通配符地址由常值INADDR_ANY指定:
#define INADDR_ANY ((unsigned long int) 0x00000000)       [netinet/in.h]
对于IPv6,通配符地址由一下方式指定:
struct sockaddr_in6 serv;
serv.sin6_addr = in6addr_any;          [netinet/in.h]
系统分配变量in6addr_any并将其初始化为常量 IN6ADDR_ANY_INIT。
#define IN6ADDR_ANY_INIT {{{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }}}   [netinet/in.h]
函数bind返回的一个常见错误是EADDRINUSE(地址已使用)。

#include <sys/socket.h>
int listen(int sockfd, int backlog)
功能: 将未连接的主动套接口转换成被动套接口。
返回: 成功 -> 0, 出错 -> -1
sockfd: 目标套接口描述字。
backlog: 规定内核为此套接口排队的最大连接个数。backlog为已完成连接队列(三次握手完成,处于ESTABLISHED状态)和 未完成连接队列(三次握手中,处于SYN_RCVD状态)之和。
当进程调用函数accept时,已完成连接队列中的队头条目返回给进程,但当队列为空时,进程将睡眠,知道有条目放入已完成队列才唤醒它。

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
功能:从已完成连接队列头返回下一个已完成连接。若已完成连接队列为空,则进程睡眠。
返回:成功 -> 已连接套接口描述字connected socket,代表与客户的TCP连接, 出错 -> -1.
sockfd: 监听套接口描述字listening socket。
cliaddr: 连接对方进程(客户)的协议地址。
addrlen: 值-结果参数,调用前,此整数值置为由cliaddr所指的套接口地址结构的长度,返回时,此整数值即为由内核存在此套接口地址结构内的准确字节数。
给定的服务器常常是只生成一个监听套接口且一直存在,知道该服务器关闭。内核为每个被接受的客户连接创建一个已连接套接(完成TCP三次握手)口,当服务器完成某客户的服务时,关闭已连接套接口。
如果对返回的客户协议地址不感兴趣,可将指针cliaddr, addrlen均置为NULL.

#include <unistd.h>
pid_t fork(void)
功能: Unix中派生新进程的唯一方法。
返回: 成功 -> 在子进程中为0,在父进程中为子进程的ID, 出错 -> -1。
子进程可以调用函数getppid获取父进程的ID;然而父进程想跟踪所有子进程的ID,他必须记住fork的返回值。
父进程中调用fork之前打开的所有描述字在函数fork返回之后都是共享的。并发服务器: 父进程调用accept,然后调用fork,这样,已连接套接口就在父进程与子进程间共享,一般地,接下来就是子进程读,写已连接套接口,而父进程则关闭已连接套接口。

#include <unistd.h>
int execl(const char *pathname, const char *arg0, ... /* (char *) 0 */);
int execv(const char *pathname, char * const argv[]);
int execle(const char *pathname, const char *arg0, /* (char *) 0, char * const envp[] */);
int execve(const char *pathname, char *const argv[], char *const envp[]);
int execlp(const char *filename, const char *argv0, ... /* (char *) 0 */);
int execvp(const char *filename, char *const argv[]);

所有六个函数: 成功 -> 无返回, 出错 -> -1。
以文件形式存储在磁盘上的可执行程序被Unix执行的唯一方法是:由一个现有进程调用六个exec函数中的一个。exec用新程序代替当前进程映像,且此新程序一般都是从main函数开始执行。一般将调用exec的进程称为调用进程calling process,而将新执行的程序称为新程序new program。
六个exec函数间的区别:
1. 被执行的程序是由文件名(filename)还是路径名指定(pathname);
2. 新程序的参数是一一列出还是由一个指针数组来索引;
3. 调用进程的环境传递给新进程还是指定新环境。
注意的地方:
1. 必须使用空指针来表示可变数量参数的终止或argv数组的结束(因为数组没有指定大小);
2.filename,将根据现行的PATH环境变量转换为pathname。但若filename参数中含有斜扛'/',将不再使用PATH变量。
3. envp必须以一个空指针结束。
一般来讲,调用exec之前在进程中打开的描述字在跨exec过程中保持打开。[描述字也可用函数fcntl设置FD_CLOEXEC描述字标志来关闭]

并发服务器
文件或套接口的访问记数: 该访问计数在文件表项中维护,它表示当前指向该文件或套接口的打开的描述字的个数。描述字只在访问计数值达到 0 时才正真关闭。
因此,并发服务器调用fork后,父进程关闭已连接套接口,子进程关闭监听套接口。

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, socklen *addrlen);
功能: 返回与套接口关联的本地协议地址(getsockname),或返回与套接口关联的远程协议地址(getpeername)。
返回: OK -> 0,  出错 -> -1。

转载于:https://www.cnblogs.com/learne/archive/2009/08/10/1543135.html

第4章 基本TCP套接口编程相关推荐

  1. 第8章 基本UDP套接口编程

    TCP: 面向连接的,提供可靠的字节流. UDP: 无连接,不可靠的数据报协议. UDP: DNS 域名系统, NFS 网络文件系统, SNMP 简单网络管理协议. #include <sys/ ...

  2. TCP套接口的sk_backlog接收队列

    在接收到数据包之后,如果判断此套接口当前正被用户进程所使用,数据包将被保存到套接口结构的sk_backlog成员的head所定义的skb缓存列表中,tail指向链表的末尾,len变量记录了当前链表中所 ...

  3. TCP套接口的FIN_WAIT_2状态超时

    PROC文件tcp_fin_timeout默认为60秒,内核中相应的变量为init_net.ipv4.sysctl_tcp_fin_timeout,不过其以jiffies表示,默认值为TCP_FIN_ ...

  4. TCP套接口热迁移REPAIR模式

    要实现TCP套接口的热迁移,必须能够实现在迁移之前保存套接口的当前状态,迁移之后还原套接口的状态.Linux内核中为支持TCP套接口热迁移实现了REPAIR模式以及相关的操作.迁移流程如下,首先启用R ...

  5. TCP套接口的最大SYN队列长度

    通过PROC文件查看队列长度,可见对于4G内存的系统,tcp_max_syn_backlog的值为128:对于8G内存的系统,其值为256. # cat /proc/sys/net/ipv4/tcp_ ...

  6. 网络编程学习笔记(TCP套接口选项)

    其套接口级别为IPPROTO_TCP TCP_KEEPALIVE: 指定TCP开始发送保持存活探测分节前以秒为单位的连接空闲时间.此选项在SO_KEEPALIVE套接口选项打开时才有效 TCP_MAX ...

  7. 第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例

    TCP客户与服务器进程之间发生的重大事件时间表 TCP服务器 socket() --- bind() --- listen() --- accept() --- read() --- write -- ...

  8. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  9. 网络编程学习笔记(ICMPv6和IPv6套接口选项)

    ICMPv6套接口选项级别为IPPROTO_ICMPV6 ICMP6_FILTER: 获取和设置一个icmp6_filter结构,这指明256个可能的ICMPv6消息类型中哪一个传递给在原始套接口上的 ...

  10. 网络编程学习笔记(基本套接口选项)

    SO_BROADCAST套接口选项: 此选项使能或禁止进程发送广播消息的能力.只有数据报套接口支持广播,并且还必须是在支持广播消息的网络上(例如以太网.令牌网).不能在一个点对点链路上进行广播. SO ...

最新文章

  1. zabbix 监控CDN带宽
  2. HighNewTech:70后、80后、90后、95后职场人大数据调查(有趣的五个结论)——源于猎聘网
  3. 用python做mud
  4. iOS开发之解决系统数字键盘无文字时delete键无法监听的技巧
  5. strtoupper 小写_PHP strtoupper()函数与示例
  6. RabbitMQ 关键词解释
  7. 不服气不行,同样是码农,字节程序员的年薪居然达247万
  8. svn查看某个时间段的日志信息
  9. live writer 中注册博客园需要的设置
  10. Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
  11. 《天勤数据结构》笔记——假溢出和循环队列基本操作的实现(C/C++)
  12. UEFI原理与编程(二):UEFI工程模块文件-标准应用程序工程模块
  13. jemalloc 深入分析 之 Tcache 实现原理
  14. ArcGIS在水文水资源、水环境中的实践技术应用及案例分析
  15. [4G5G基础学习]:L3 RRC层概述与总体架构、ASN.1消息、无线承载SRB, DRB、终端三种状态、MIB, SIB,NAS消息类型
  16. QA是干什么的?(职责所在????)
  17. 新手怎么做一个免费的单页面响应式网站?
  18. MATLAB显示slic,quickshift超像素分割结果图
  19. 离散数学·代数结构【正规子群、商群、群的同态和同构、环与域、格、布尔代数】
  20. folder.htt等文件的问题

热门文章

  1. 一分钟先生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(三十二)...
  2. Funcom Seeking Volunteer Mods - Part 3
  3. Python基础--01
  4. DropDownList的项按字母顺序排列
  5. redis远程连接的几种方式
  6. win10系统下Consul持久化
  7. PHP获取每个订单下订单商品的数量
  8. jquery html 动态添加元素绑定事件
  9. 全网首发:doubango提示text relocations错误的解决办法
  10. 解决办法:无法解析的外部符号 __imp_RegCloseKey