1、相关基础
tcp协议:面向连接的,一对一的可靠通信
可靠性:严格的应答机制
每一个数据包都有一个对应的编号
(1)端口:
标识进程 无符号短整型:0~65535 01024被内核使用。用户可指定端口:102465535
字节库:大端库 小端库
网络字节序通常是大端序:大端就是指地址存放高字节
个人pc的字节序通常是小端序:小端就是指地址存放高字节
结论:需要在网络绑定port端口是进行字节序的转换
eg:
#include <stdio.h>
int main()
{
int a=0x11223344;
char *p=(char *)&a;
printf("%p %#x\n",p,*p);
printf("%p %#x\n",p+1,*(p+1));
printf("%p %#x\n",p+2,*(p+2));
printf("%p %#x\n",p+3,*(p+3));
return 0;
}
输出:
如图,低字节44存放在FE14低地址中,高字节11存放在FE17高地址中,这就是小端序,我们大部分系统都是小端序。
(2)客户端与服务器的连接(握手)与断开(挥手)
ACK: 应答
SYN:请求
FIN:请求断开
2、TCP服务器和客户端的搭建
tcp流程 服务器:socket() --> bind() --> listen() --> accept() --> read/write or recv/send -->close()
客户端:socket() --> connect() --> read/write or recv/send -->close()
这里只介绍两个函数,其他函数说明因为说过了,可以看之间的博客。
recv()—接收
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
send()—发送
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
3、实例说明
(1).客户端给服务器发送一个字符串,服务器返回给客户端这个字符串的长度 sprintf(buf, “%d”, strlen(buf));
(2).实现一个时间服务器,客户端发送time,服务器返回当前时间。
time_t val = time(NULL); char *p = ctime(&val); char data[64] = {0}; strcpy(data, p);
(3).如果客户端发送get 1.txt的请求,服务器获取文件内容后,发送给客户端。
(4)服务器与客户端的交互
代码演示:
1、TCP服务器:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
void *send_data(void *arg)//子线程
{
int connfd=*(int *)arg;
char buf[64]={
0};
while(1)
{
fgets