socket 编程 笔记

1、服务端API

1)调用socket函数来创建套接字。

#include <sys/socket.h>
int socket(int domain, int type, int protocol);
// 成功时返回套接字文件描述符,失败时返回-1

参数domain指定协议族信息,可以是PF_INET (ProtocolFamily_INET), 指的是IPv4协议族,socket编程中标识符包含的INET和in指的都是IPv4。

参数type指定套接字数据传输方式,可以是面向连接的TCP套接字SOCK_STREAM, 也可以是面向消息的UDP套接字SOCK_DGRAM。 

参数protocol指定最终采用的协议, 同一个协议族中某个socket类型下只有一种协议,该参数可以指定为0

socket中有输入缓冲和输出缓冲,分别是一个字节数组。收到数据保存到输入缓冲,要发送的数据保存在输出缓冲中。收到数据并不意味着马上调用read函数。只要不超过数组容量,则有可能在数据填充满缓冲区后通过一次read函数调用读取全部,也有可能分成多次read调用进行读取。也就是说,在面向连接的套接字中,read函数和write函数的调用次数并无太大意义。所以说面向连接的套接字不存在数据边界。

2)调用bind函数把服务端地址信息分配给套接字

 #include <sys/socket.h>

 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
// 成功时返回0, 失败时返回-1

参数sockfd指定要分配地址信息(IP地址和端口号)的套接字文件描述符。

参数addr指定存有地址信息的结构体变量的地址。

参数addrlen指定第二个结构体变量的长度。

sockaddr_in 表示IPv4地址的结构体,sockaddr是通用的表示地址信息的结构体。

字符串形式的IP地址和端口号需要转换成网络字节序的整型值,才能赋值给sockaddr_in型的结构体的成员。 除了向sockaddr_in型结构体变量填充数据外,其他情况无需考虑字节序问题。

    struct sockaddr_in serv_addr;    
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = inet_addr(argv[1]);
    serv_addr.sin_port = htons(atoi(argv[2]));

3)调用listen函数进入等待连接请求的状态。

 #include <sys/socket.h>

 int listen(int sockfd, int backlog);
// 成功时返回0,失败时返回-1

参数sockfd表示希望进入等待连接请求状态的套接字文件描述符,该套接字将变成监听套接字。

参数backlog表示连接请求等待队列的长度。表示最多可以存储多少个连接请求。

调用listen函数会后创建连接请求等待队列,之后客户端才能请求连接。

客户端连接请求是从网络中接收到的一种数据,监听套接字用来接收客户端连接请求,并将连接请求存储在连接请求等待队列中。

4)调用accept函数受理连接请求等待队列中待处理的客户端连接请求。

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 成功时返回创建的套接字文件描述符,失败时返回-1

accept函数从等待队列中取出一个连接请求,创建套接字并完成连接请求。该套接字用来与客户端建立连接后进行数据交换。

调用accept函数时如果等待队列为空,则accept函数会阻塞(不返回),直到等待队列出现新的客户端请求。

 

2、客户端API

1)调用socket函数创建套接字

2)调用connect函数请求连接

 #include <sys/socket.h>

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

connect函数返回的条件:1)服务端接收连接请求,“接收连接请求”并不意味着服务端调用了accept函数,其实是服务端把连接请求信息记录在等待队列中。因此connect函数返回后并不立即进行数据交换。2)发生断网等异常情况而中断连接请求

3、函数调用关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值