selph
selph
发布于 2022-02-11 / 377 阅读
0
0

TCPIP网络编程ch02--套接字类型和协议设置

本章将详细介绍创建套接字的socket函数

socket函数声明

#include <sys/socket.h>

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

参数介绍:

  • domain:套接字使用的协议族信息
  • type:套接字数据传输类型信息
  • protocol:计算机通信中使用的协议

参数1:协议族

image-20220211195843668

本书重点介绍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

评论