本章将详细介绍创建套接字的socket函数
socket函数声明
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数介绍:
- domain:套接字使用的协议族信息
- type:套接字数据传输类型信息
- protocol:计算机通信中使用的协议
参数1:协议族
本书重点介绍PF_INET的IPv4协议族
参数2:套接字类型
套接字类型决定数据传输方式,对于PF_INET协议族(IPv4)常见的数据传输方式有两种:
SOCK_STREAM:面向连接的套接字(TCP)
可靠的,按序传递的,基于字节的面向连接的数据传输方式的套接字
- 不存在数据边界
- 保障数据传输顺序
- 保障传输不会丢失
缓冲区满了,传输会暂停,等缓冲区有空位了,继续传输,因此不会数据丢失,没有数据边界
发送端和接受端的套接字必须一一对应
SOCK_DGRAM:面向消息的套接字(UDP)
不可靠的,不按序传输的,以数据的高速传输为目的的套接字
- 强调快速传输而非顺序传输
- 传输数据可能丢失也可能出错
- 传输数据有数据边界
- 限制每次传输大小
参数3:协议类型
数据传输方式相同,但传输协议不同,所以需要第三个参数指定协议类型
PF_INET协议族(IPv4):
- 满足面向连接的协议是:
IPPROTO_TCP
- 满足面向消息的协议是:
IPPROTO_UDP
TCP套接字示例--Linux
在第一章代码基础上进行修改来验证TCP传输特性:传输数据不存在数据边界
修改第一章代码的客户端的读取代码:分多次读取
// 从套接字读取内容
while(read_len = read(sock, &message[idx++],1)){
if(read_len == -1)error_handling("read() error");
str_len += read_len;
}
执行结果:
selph@selph:~/NetProgramStudy/ch2-linux$ ./hello_client 127.0.0.1 11114
Connecting...
Msessage From Server(22 byte): hello ,there is selph!
Call read() times is : 22
TCP套接字示例--Windows
修改方式和Linux示例一样,修改客户端程序,不对称的多次读取
修改读取内容如下:
int read_len = 0, idx = 0;
// 接收信息
while (read_len = recv(hSock, &message[idx++], 1, 0)) {
if (read_len == -1)exit(1);
str_len += read_len;
}
printf("Msg From Server: %s\n", message);
printf("call recv() times is :%d\n", str_len);
执行结果:
PS C:\Users\selph\source\Book\TCPIP\ch2-windows\x64\Debug> .\ch2-windows.exe 127.0.0.1 12312
Msg From Server: hello selph
call recv() times is :12