IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中

通用地址结构用来指定与套接字关联的地址。以sockaddr命名

我们进行TCP编程的时候,通常是用sockaddr_in,但提供的API函数是通用地址结构,所以,传递参数时要进行强转.

socket编程时,服务端的常规流程是socket->bind->listen->accept,而客户端的流程是socket->connect

socket 创建一个套接字用于通信

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

返回值注意:在listen函数调用前都是主动套接字,调用后调用之后变成被动套接字.

bind  绑定一个本地地址到套接字

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

其中struct sockaddr *addr

man 7 ip

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 */
};

  struct in_addr {
  uint32_t s_addr; /* address in network byte order */
};

注意:设置IP地址的时候需要用转换函数in_addr_t inet_addr(const char *cp);

设置端口的时候需要用到网络字节序,htons,htonl.

端口的设置 addr.sin_addr.s_addr = htons(8001)

listen

一般来说,listen函数应该在调用socket和bind函数之后,调用函数accept之前调用。

对于给定的监听套接口,内核要维护两个队列:

1、已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程

2、已完成连接的队列

accept

从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

注意参数addr,这个addr是已连接客户端的信息,包括IP地址和端口,与bind函数里所使用的addr不一样.

参数addrlen,表示value-result,需要提前指定大小(socklen_t addrlen = sizeof(struct sockaddr_in)),然后以地址的方式传进去,.

当函数被调用时,结构大小是一个值(value, 此值告诉内核该结构的大小,使内核在写此结构时不至于越界),

当函数返回时,结构大小又是一个结果(result,它告诉进程内核在此结构中确切存储了多少信息),这种参数叫做值-结果参数(value-result)。

connect函数  

建立一个连接至addr所指定的套接字

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

设置与服务端的bind函数一致.

服务器端尽可能使用SO_REUSEADDR

在绑定之前尽可能调用setsockopt来设置SO_REUSEADDR套接字选项。

使用SO_REUSEADDR选项可以使得不必等待TIME_WAIT状态消失就可以重启服务器

关于sockfd与connfd

sockfd是一开始socket函数打开的一个新的套接字的文件描述符,需要提供给bind函数,listen函数,accept函数使用,

当有客户端连接,accept函数返回后,将产生一个新的套接字的描述符(connfd,而非sockfd),用来专门与客户端进行通信,

总的来说,sockfd就是服务器用来让客户端进行连接的套接字,而connfd是专门为服务器与客户端进行通信的.

服务器行多并发的时候,需要一个通道进行连接,另一个通道进行通信.

当客户端只有一个时,可以将sockfd与connfd合二为一,但客户端多的时候,这样的设计会让tcp通信变量混乱.故而分开设计之.

linux第5天 socket api的更多相关文章

  1. JAVA Socket API与LINUX Socket API探究

    代码 这是一个带有UI界面的JAVA网络聊天程序,使用Socket连接完成通信. JAVA服务端程序 import java.io.IOException; import java.io.InputS ...

  2. Java实现网络聊天中使用的socket API与Linux socket API之间的关系

    尝试着用Java编写一个网络聊天程序,发现总不如网上写的好,所以就直接引用了网上大神的优秀代码.代码如下: package project1; import java.awt.*; import ja ...

  3. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  4. Linux网络协议栈(一)——Socket入门(1)

    转自: http://www.cnblogs.com/hustcat/archive/2009/09/17/1568738.html 1.TCP/IP参考模型为了实现各种网络的互连,国际标准化组织(I ...

  5. ZT Linux系统环境下的Socket编程详细解析

    Linux系统环境下的Socket编程详细解析 来自: http://blog.163.com/jiangh_1982/blog/static/121950520082881457775/ 什么是So ...

  6. socket编程 ------ BSD socket API

    伯克利套接字(Berkeley sockets),也称为BSD Socket.伯克利套接字的应用编程接口(API)是采用C语言的进程间通信的库,经常用在计算机网络间的通信. BSD Socket的应用 ...

  7. TCP协议和socket API 学习笔记

    本文转载至 http://blog.chinaunix.net/uid-16979052-id-3350958.html 分类:  原文地址:TCP协议和socket API 学习笔记 作者:gilb ...

  8. 刨根问底系列(3)——关于socket api的原子操作性和线程安全性的探究和实验测试(多线程同时send,write)

    多个线程对同一socket同时进行send操作的结果 1. 概览 1.1 起因 自己写的项目里,为了保证连接不中断,我起一个线程专门发送心跳包保持连接,那这个线程在send发送数据时,可能会与主线程中 ...

  9. 从linux源码看socket(tcp)的timeout

    从linux源码看socket(tcp)的timeout 前言 网络编程中超时时间是一个重要但又容易被忽略的问题,对其的设置需要仔细斟酌.在经历了数次物理机宕机之后,笔者详细的考察了在网络编程(tcp ...

随机推荐

  1. 蓝牙BLE LINK LAYER剖析(二) -- PDU

    DATA FORMAT The Link Layer has only one packet format used for both advertising channel packets and ...

  2. javascript 原生事件综合查询

    click() 对象.click() 使对象被点击. closed 对象.closed 对象窗口是否已关闭true/false clearTimeout(对象) 清除已设置的setTimeout对象 ...

  3. Qt 窗口属性简介之Qt::WA_DeleteOnClose

    一.简述 今天介绍一个简单的窗口属性——Qt::WA_DeleteOnClose. 在正常创建窗口后,我们一般会调用close()方法来关闭窗口,这里我们看一下Q助手中关于close()方法的介绍. ...

  4. yii2 实现多表联查

  5. BI 商业智能理解结构图

    本文章是在本人实习阶段对BI(商业智能 Business Intelligence)的理解:(如有不足之处请多指教,谢谢) BI 系统负责从多个数据源中搜集数据,并将这些数据进行必要的转换后存储到 ...

  6. pch找不到pod里头文件

    1. 问题描述 将文件用pod管理起来后,pod install成功,而且这些文件也可以搜索得到,但是pch文件里import的头文件找不到,而这些头文件又确确实实在你的pod项目下. 2. 解决办法 ...

  7. Fiddler-007-修改HTTP请求响应数据

    前文简述了如何通过 Fiddler 修改 HTTP请求 的请求参数,详情请参阅:Fiddler-006-修改HTTP请求参数. 在进行 App 测试时,经常需要修改请求参数,以获得不同的显示效果,以查 ...

  8. Windows-009-Win7 操作系统安装图文详解

    此文主要讲述 Win7 操作系统的安装,配以详细的图文介绍,希望能对亲有所帮助,若有不足之处,敬请大神指正,不胜感激! 若是亲在虚拟机(VirtualBox)中安装 Win7,其前期虚拟硬件系统的操作 ...

  9. js跳转方法

    很有用的东西,参考自http://www.zhuoda.org/lunzi/66097.html 第一种 <script language="javascript" type ...

  10. oracle视图V$BH && X$BH的使用列子

    1创建一个测试表,test,并且插入10000行数据:    SQL>  create table test (id int); SQL> begin      2  for i in 1 ...