`
gaofen100
  • 浏览: 1184849 次
文章分类
社区版块
存档分类
最新评论

TCP/IP af_inet.c

 
阅读更多

1. 如果客户端connect前没有指定源端口号,系统自动分配一个并绑定。

/*
* Automatically bind an unbound socket.
*/

static int inet_autobind(struct sock *sk)
{
/* We may need to bind the socket. */
if (sk->num == 0)
{
sk->num = get_new_socknum(sk->prot, 0);
if (sk->num == 0)
return(-EAGAIN);
put_sock(sk->num, sk);
sk->dummy_th.source = ntohs(sk->num);
}
return 0;
}

2. in function inet_create(), 拥塞窗口大小为1, 慢启动

sk->cong_window = 1; /* start with only sending one packet at a time. */

3. in function inet_dup(),

inet_dup 函数被服务器端调用。服务器端用于实际通信的套接字与其监听套接字是不同的。当应用程序在服务器端使用accept 函数接收一个客户端请求时,会创建一个新的套接字用于与客户端进行具体的数据通信, 而监听套接字仍然只负责监听其它客户端的请求。在sock_accept(accept 系统调用的BSD 层处理函数)在分配一个新的socket 结构后,调用inet_dup函数对此新创建的socket 结构进行初始化,而初始化信息主要来自监听套接字,inet_dup 函数的输入参数中newsock 即表示新创建的socket 结构,而oldsock 则表示监听套接字socket 结构。从inet_dup 实现来看,该函数调用inet_create 函数完成具体的功能:分配新socket 结构对应的下层sock 结构,此处只使用了监听socket 结构的protocol 字段。

4. 对于不同的协议使用相同的端口号不会引起任何问题.

5. 对于适用同一种协议的所有套接字都被插入到该协议对应proto(如tcp_prot)结构中sock_array 数组

6. 关于socket函数,

应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段,其调用格式如下:

SOCKET PASCAL FAR socket(int af, int type, int protocol);

该调用要接收三个参数:af、type、protocol。参数af指定通信发生的区域,:AF_UNIX、AF_INET、AF_NS等,而DOS、WINDOWS中仅支持AF_INET,它是网际网区域。因此,地址族与协议族相同。

reference: LINUX-2.4.0内核网络栈实现源代码分析

分享到:
评论

相关推荐

    linux_net.pdf

    linux tcp/ip分析 两台主机建立udp通信所走过的函数列表: | sys_read fs/read_write.c | sock_read net/socket.c | sock_recvmsg net/socket.c | inet_recvmsg net/ipv4/af_inet.c | udp_recvmsg net/ipv4/udp.c | ...

    c++ udp通信发送.rar

    #include "../common/InitSock.h" #include <stdio.h> CInitSock initSock; // 初始化Winsock库 int main() { // 创建套节字 SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if(s == INVALID_SOCKET)...

    socket linux2

    //协议族使用tcp/ip server_sockaddr.sin_port=htons(PORT);//设置端口号 server_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);//设置ip地址为本机地址 server_len=sizeof(server_sockaddr);//服务端结构体的...

    winsock四个网络程序源代码

    ipa.sin_family = AF_INET; ipa.sin_addr.s_addr = unsigned long (字节) ipa.sin_port = htons(80); 3)gethostname(hostname, 256); 4)gethostbyname(const char *name); struct hostent* 主机信息(结构体...

    WatchClient监听网络

    使用socket( AF_INET , SOCK_RAW , IPPROTO_IP )来监听本地网卡上各种类型的数据包(tcp/udp/ip/icmp/...)

    基于C语言实现TCP/IP协议的手法(源码)

    创建 TCP 套接字:使用 socket 函数创建一个套接字,指定协议族为 AF_INET(IPv4),类型为 SOCK_STREAM(流式套接字,即 TCP)。 设置地址和端口:指定服务器的地址和端口。 绑定套接字到地址和端口:使用 bind ...

    netlink.pdf

    netlink socket编程why & how netlink socekt是一种...类似于TCP/IP中使用AF_INET地址族一样,netlink socket使用地址族AF_NETLINK。每一个netlink socket在内核头文件include/linux/netlink.h中定义自己的协议类型。

    python Tcp协议发送和接收信息的例子

    需要建立2个文件,一个作为客户端,一个作为服务端 ...s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #2,建立连接发送连接请求 ip地址和端口号 s.connect(('127.0.0.1',8000)) s.send(你好.encode())

    php socket通信(tcp/udp)实例分析

    本文实例讲述了php socket通信(tcp/udp)方法。分享给大家供大家参考,具体如下: 注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 ...一: udp 方式 ...$socket = socket_create( AF_INET, SOCK_DGRAM

    基于sniffer做的一个抓包监控软件

    if( pIpAddrTable->dwNumEntries > 2 ) // Second is MS TCP loopback IP ( 127.0.0.1 ) { m_Multihomed = TRUE ; char szIP[16]; for( int i = 0 ; i (int)pIpAddrTable->dwNumEntries ; i++ ) ...

    套接字编程

    if ((Listen_Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("socket failed with error %d\n", WSAGetLastError()); WSACleanup(); return; } u_long iMode = 1; ...

    Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect((192.168.33.11, 7890)) server_ip = input(请输入要链接的服务器的ip:) server_port = int(input

    linux网络编程学习笔记

    domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX 和AF_INET 等). AF_UN IX 只能够用于单一的 Unix 系统进程间通信,而 AF_INET 是针对Internet的,因而可以允许在 远程 主机之间通信(当我们 man socket ...

    计算机网络课程设计发送TCP数据包.doc

    实验三 发送TCP数据包 实验目的: 设计一个发送TCP数据包的程序,并根据本设计说明TCP数据包的结构以及TCP协议与 IP协议的关系,使大家对TCP协议的工作原理有更深入的认识。 实验要求: 本程序的功能是填充一个TCP...

    用C自己编写端口扫描软件

    s=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建套接字 /* SOCKET socket(int af,int type,int protocol); 为通信连接创建一个套接字 af参数: 指定套接字地址格式,在winsock中只能使用AF_INET type参数...

    python实现客机对主机的交互和Ai回复

    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 # server_ip = input("请输入服务器ip:") # server_port = int(input("请输入服务器port:")) # tcp_socket.connect((server_ip,...

    Linux 蓝牙协议栈的USB+设备驱动

    AF_INET socket BNEP层 (bnep.o) 其他设备驱动 (bluecard_cs.o等) BlueZ工具和实用程序 HDIP层 (hdip.o) BlueZ核心 及HCI层(bluez.o/bluetooth.o) 图 1 BlueZ 组织结构 3 蓝牙 USB 设备驱动 设备驱动程序在 ...

    基于TCP的服务器客户端编程讲解.doc

    " " 返回:非负描述字---成功 -1---失败 " " 第一个参数指明了协议簇,目前支持5种协议簇,最常用的有AF_INET(IPv4协议)" "和AF_INET6(IPv6协议);第二个参数指明套接口类型,有三种类型可选:SOCK_STREA" ...

    端口扫描VC++程序代码

    Sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (Sock==INVALID_SOCKET) { MessageBoxA(NULL,"INVALID_SOCKET",NULL,NULL); } //填充IP地址及端口信息 SockAddr.sin_family = AF_INET; SockAddr.sin...

    Python使用socket模块实现简单tcp通信

    my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 先拿到套接字,指定个ipv4以及流式数据包 my_socket.bind(ip_port) # 绑定 my_socket.listen(2) # 循环等待客户端连接 while True: print(...

Global site tag (gtag.js) - Google Analytics