TCP
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
套接字
TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)表示,区分不同应用程序进程间的网络通信和连接,主要有3个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
套接字又可分为三种类型:字节流套接字,数据报套接字,原始套接字。
1.查看while源代码
1.1 socket
int socket(int domain, int type,int protocol)
socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
1.2 bind
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
ipv6对应的是:
struct sockaddr_in6 {
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
struct in6_addr {
unsigned char s6_addr[16];
};
addrlen:对应的是地址的长度。
1.3 listen
int listen(int sockfd,int backlog)
backlog 设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度
说明: listen
函数将bind
的文件描述符变为监听套接字.返回的情况和bind
一样.
1.4 accept
int accept(int sockfd, struct sockaddr *addr,int *addrlen)
addr/addrlen 是用来给客户端的程序填写的,服务器端只要传递指针就可以了
bind,listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接. accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-1
2.编译并在ubuntu下运行
编译命令
gcc -o server-while-tcp.out server-while-tcp.c
gcc -o client.out client.c
运行命令
./server-while-tcp.out
./client.out 192.168.1.***
3.修改服务器为多线程模式
客户端向服务器发送数据后,服务器端打印数据。
服务器将得到的数据全部转换为大写后返回到客户端。
客户端打印出从服务器端返回的数据。
4.编译并在ubuntu下运行