zoukankan      html  css  js  c++  java
  • unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议
    1. #include<sys/socket.h>
    2. int socket(int family,int type,int protocol);
    family表示协议族,比如AF_INET,type表示套接字类型, protocol一般设置为0
    family: AF_INET ipv4协议
    type: SOCK_STREAM 字节流套接字 SOCK_DGRAM 数据报套接字 SOCK_RAW 原始套接字
    protocol:一般是设置为0

    connect函数
    1. #include<sys/socket.h>
    2. int connect(int sockfd,const struct sockaddr*servaddr,socklen_t addrlen);
    该套接字结构必须含有服务器的ip地址.客户端在调用connect之前不用bind.因为一般不需要知道客户端的ip跟端口.因此不调用bind直接connect.内核会指定一个本地地址跟一个临时端口

    TCP中connect函数将激发tcp三次握手过程.只有建立成功或者出错时才会返回,其中出错的返回有以下3种情况
    (1)客户端木有收到syn发送出去后服务端返回的ack.一般无响应会再次发送.一旦还没收到.就会返回etimedout错误.表示超时
    (2).对客户端的SYN响应是RST.客户端一旦收到马上返回ECONNREFUSED错误
    (3)客户端发出的syn在中间的某个路由器引发了一个"destination unreachable(目标无法到达)ICMP错误.客户主机将保存该信息,并按第一种情况间隔一段时间继续发送SYN.如果在某个规定的时间依然没有收到响应.就把保存的信息作为ehostunreach错误返回给进程.以下两种情况也有可能:按照本地系统转发表,没有到达远程系统的路径.connect调用根本不等待就返回

    bind函数
    bind把一个本地协议地址(ipv4 or ipv6)跟端口(2者非必须)绑定到一个套接字中.
    1. #include<sys/socket.h>
    2. int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);
    3. //成功返回0.出错返回-1


    LIsten函数
    (1)listen函数只由tcp服务端调用
    当socket创建一个套接字的时候.被假设为一个主动套接子.listen则把一个为未连接的套接字转为一个被动套接字.指示内核应该接受该套接字的连接请求
    (2)此函数第2个参数规定了内核应该为相应套接字排队的最大连接个数
    1. #include<sys/socket.h>
    2. int listen(int sockfd,int backlog);
    3. 返回:成功返回0.失败返回-1
    内核为任何一个给定的监听套接字维护2个队列
    (1) 未完成连接队列(syn_recd)(2).已完成队列(处于established)
    二者连接之和不超过backlog
    在三路握手正常完成的前提下.未完成连接队列中的任何一项在其中停留时间为RTT
    一个客户SYN到达时,如果这些队列是满的,tcp就会忽略该分节,也就不是不会发送RST,客户端TCP将会重发SYN,期待不就将来可以在这些队列找到可用队列



    accept函数
    由tcp服务器调用,用于从已完成连接队列队头返回下一个已完成连接,如果连接队列为空,进程将被休眠
    1. #include<sys/socket.h>
    2. int accept(int sockfd,struct sockaddr*cliaddr,socklen_t *addrlen);
    3. 返回:若成功返回非负描述符,若出错则为-1

     close函数
    把一个tcp套接字标记为已关闭.返回到调用进程.该套接字描述符不能再由调用进程使用.
    不过如果父进程fork了一个子进程.即使子进程close套接字描述符,子进程不能再读写该套接字描述符.
    但父进程依旧可以读写该被子进程关闭的套接字,原因:文件表的引用计数.

    以上是基于TCP/IP的套接字函数调用过程


    getsockname跟getpeername函数
    前一个番号跟某个套接字关联的本地套接字结构.后一个番号跟某个套接字的对端套接字结构














     





  • 相关阅读:
    用C#开发.NET CF 蓝牙通信模块
    记录台湾民众生活:一起来看看台湾的物价
    .NET Socket开发之同步Socket实现两例
    SOA和BPM结合的三种方法
    Why we chose ASP.NET to run our startup
    用JScript.net写.net应用程序
    Linux至少有五大点比Vista更好
    Windows 窗体的.Net 框架绘图技术
    优化增强您的Visual C++应用程序
    VS 2008和.NET 3.5 Beta2新特性介绍
  • 原文地址:https://www.cnblogs.com/zengyiwen/p/5755213.html
Copyright © 2011-2022 走看看