基本函数接口

socket函数

#include <sys/socket.h>

int socket(int family, int type, int protocol);

成功时返回一个非负整数,与文件描述符类似,称为套接字描述符 sockfd。各参数的意义:

  1. family 指明协议族。取值为以下中的一个:

    • AF_INET --> ipv4协议
    • AF_INET6 --> ipv6协议
    • AF_LOCOL --> Unix域协议
    • AF_ROUTE --> 路由套接字
    • AF_KEY --> 密钥套接字
  2. type 指明套接字类型。取值为以下中的一个:

    • SOCK_STREAM --> 字节流套接字
    • SOCK_DGRAM --> 数据报套接字
    • SOCK_SEQPACKET --> 有序分组套接字
    • SOCK_RAW --> 原始套接字
  3. protocol 设为某个协议类型常值。设为0时,选择所给定family和type组合的系统默认值。

    • IPPROTO_TCP --> TCP传输协议
    • IPPROTO_UDP --> UDP传输协议
    • IPPTORO_SCTP --> SCTP传输协议

connect 函数

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

connect由客户端程序调用,用来建立与TCP服务器的连接。成功返回0, 出错返回-1

  • sockfd 是socket()函数返回的套接字描述符
  • servaddr 指向套接字地址结构的指针
  • addrlen 套接字地址结构的大小

bind

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

bind把一个本地协议地址赋予一个套接字。对于网际网协议,协议地址是IP+端口号的组合。

对于服务器上的某个服务,如果把特定的IP和端口绑定到这个服务进程的套接字上,则客户端发过来的连接信息中目的地址和目的端口必须为这里指定的IP和端口。

对于客户端,如果绑定IP和端口到套接字上,则该套接字上发送的IP数据报指派了源IP地址。而客户端通常不做这些绑定,当要连接服务器时,内核为套接字选择一个临时端口,并根据外出网络接口来选择源IP地址。

listen

#include <sys/socket.h>
int listen(int sockfd, int backlog);
  1. 当socket函数创建一个套接字时,它被假设为一个主动套接字,将要调用connect去发起连接。listen可以把它转换为被动套接字,指示内核应该接受指向该套接字的连接请求。
  2. backlog 规定内核为相应套按字排队的最大连接个数。

内核为一个给定的监听套接字维护两个队列:

  • 未完成连接队列
  • 已完成连接队列

accept

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

accept()函数由TCP服务器调用,用于从已完成连接队列头返回下一个已完成连接。 如果已完成队列为空,则进程进入休眠。

cliaddr 返回已连接的对端进程协议地址结构,addrlen是对端协议地址结构的长度。

accept()成功则返回值是一个全新的描述符,代表与所返回客户端的连接,称为已连接套接字。

close

关闭套接字,内核中该套接字描述符的引用计数会减1。


习题

  1. 头文件<netinet/in.h>中定义的INADDR_常值是主机字节序的。我们应该如何辨别?

  2. 把图1-5改为在connect成功返回后调用getsockname。使用sock_ntop显示赋予TCP套接字的本地IP地址和本地端口号。你的系统的临时端口在什么范围内?

  3. 在一个并发服务器中,假设fork调用返回后子进程先运行,而且子进程承受后在fork调用返回父进程之前就完成对客户端的服务。图4-13中的两个close调用将会发生什么?

  4. 在图4-11中,先把服务器的商品号从13改为9999,再删掉listen调用,将会发生什么?

  5. 继续上一题,删掉bind调用,但是保留listen调用, 又将发生什么?

4. 基本TCP套接字编程的更多相关文章

  1. 【UNIX网络编程(四)】TCP套接字编程具体分析

    引言: 套接字编程事实上跟进程间通信有一定的相似性,可能也正由于此.stevens这位大神才会将套接字编程与进程间的通信都归为"网络编程",并分别写成了两本书<UNP1> ...

  2. UNP学习笔记1——基本TCP套接字编程

    1 套接字地址结构 大多数套接字函数都需要一个指向套接字地址结构的指针作为参数.每个协议族都定义了自己的套接字结构.这些套接字的结构以sockaddr_开头,以每个协议族唯一的后缀名结尾. 1.1 I ...

  3. TCP套接字编程模型及实例

    摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析. PS:本文权当 ...

  4. 初探网络编程--TCP套接字编程演示

    今天看了一下<计算机网络:自顶向下方法>,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程. 程序流程如下: 1.一台 ...

  5. 套接字编程相关函数(2:TCP套接字编程相关函数)

    本文摘录自<UNIX网络编程 卷1>. 基本套接字函数 socket函数 为了执行网络I/O,一个进程必须做的第一件事就是调用socket函数,指定期望的通信协议类型.其定义如下: #in ...

  6. TCP套接字编程

    一.套接字(socket)函数 图1给出了在一个TCP客户与服务器通信的流程.服务器首先启动,稍后某个客户启动,它试图连接到服务器.假设客户给服务器发送一个请求,服务器处理该请求,并且给客户发回一个相 ...

  7. 【UNIX网络编程(二)】基本TCP套接字编程函数

    基于TCP客户/server程序的套接字函数图例如以下: 运行网络I/O.一个进程必须做的第一件事就是调用socket函数.指定期望的通信协议类型. #include <sys/socket.h ...

  8. <网络编程>基本TCP套接字编程

    tcp提供了可靠传输,当tcp向另一端发送数据的时候,要求对端返回一个确认.如果没有接收到确认,tcp就重传数据并且等待更长时间,数次重传失败后,tcp才放弃. 建立一个tcp连接会发生如下事情: 服 ...

  9. unix网络编程——TCP套接字编程

    TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...

  10. unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...

随机推荐

  1. php 上传文件名出现乱码

    想必很多朋友在进行utf8编码的php开发上传功能的时候,都会遇到这样的一个问题,就是上传中文文件名的文件时,文件名会变成乱码,其实我们可以用iconv函数对文件名进行重新编码就解决问题了 可能会有不 ...

  2. [UOJ#128][BZOJ4196][Noi2015]软件包管理器

    [UOJ#128][BZOJ4196][Noi2015]软件包管理器 试题描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管 ...

  3. URAL Formula 1 ——插头DP

    [题目分析] 一直听说这是插头DP入门题目. 难到爆炸. 写了2h,各种大常数,ural垫底. [代码] #include <cstdio> #include <cstring> ...

  4. BZOJ3532 [Sdoi2014]Lis 【网络流退流】

    题目 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若 干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出将删去项的附加属性排序 ...

  5. 刷题总结——动态逆序对(bzoj3295)

    题目: Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素 ...

  6. Java定时器Web(转)

    通过定时器进行任务的执行是比较常见的情况,下面的是个简单的示例: 主要借助于监听器和TimerTask和Timer类进行实现,另外spring提供了定时器的高级实现好像是quarts. package ...

  7. 云计算与 OpenStack

    “云计算” 算是近年来最热的词了.现在 IT 行业见面不说这三个字您都不好意思跟人家打招呼. 对于云计算,学术界有各种定义,大家有兴趣可以百度一下. CloudMan 这里主要想从技术的角度谈谈对云计 ...

  8. 负环 BZOJ 4773

    负环 [问题描述] 在忘记考虑负环之后,黎瑟的算法又出错了.对于边带权的有向图 G = (V, E),请找出一个点数最小的环,使得环上的边权和为负数.保证图中不包含重边和自环. [输入格式] 第1两个 ...

  9. 解决PHP无法接收post超过1000个字段的问题

    今天在做与后台交互的的过程中,发现php对于接收的POST有一个限制,超出1000个字段之后便无法接收,项目要求在不改变PHP配置的情况下通过前端方式解决,通过分析并且网上差一些大牛的资料终于找到了解 ...

  10. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...