既然要用c语言实现tcp协议,我们就先看看什么是tcp协议,再去操作实践。
tcp协议的介绍:
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
(以上介绍引用自百度百科)
https://baike.baidu.com/item/...
明白了tcp,我们就要考虑我们应该做些什么
读完了上面的内容,应该脑子里还是很懵,我这里找了一张更为清晰的图片概括
也就是说,我们把图片里的内容用代码表述出来,一切就搞定。
我先把完整代码写出来,再对其中的难点进行介绍
#include <stdio.h>
#include <arpa/inet.h>//inet_addr() sockaddr_in
#include <string.h>//bzero()
#include <sys/socket.h>//socket
#include <unistd.h>
#include <stdlib.h>//exit()
#define BUFFER_SIZE 1024
int main() {
char listen_addr_str[] = "0.0.0.0";
size_t listen_addr = inet_addr(listen_addr_str);
int port = 8080;
int server_socket, client_socket;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_size;
char buffer[BUFFER_SIZE];//缓冲区大小
int str_length;
server_socket = socket(PF_INET, SOCK_STREAM, 0);//创建套接字
bzero(&server_addr, sizeof(server_addr));//初始化
server_addr.sin_family = INADDR_ANY;
server_addr.sin_port = htons(port);
server_addr.sin_addr.s_addr = listen_addr;
if (bind(server_socket, (struct sockaddr *) &server_addr, sizeof(server_addr)) == -1) {
printf("绑定失败\n");
exit(1);
}
if (listen(server_socket, 5) == -1) {
printf("监听失败\n");
exit(1);
}
printf("创建tcp服务器成功\n");
addr_size = sizeof(client_addr);
client_socket = accept(server_socket, (struct sockaddr *) &client_addr, &addr_size);
printf("%d 连接成功\n", client_socket);
char msg[] = "恭喜你连接成功";
write(client_socket, msg, sizeof(msg));
while (1) {
str_length = read(client_socket, buffer, BUFFER_SIZE);
if (str_length == 0) //读取数据完毕关闭套接字
{
close(client_socket);
printf("连接已经关闭: %d \n", client_socket);
break;
} else {
printf("客户端发送数据:%s",buffer);
write(client_socket, buffer, str_length);//发送数据
}
}
return 0;
}
好了,最简单的tcp就实现完毕了。
附:Linux网络常用头文件说明
sys/types.h:数据类型定义
sys/socket.h:提供socket函数及数据结构
netinet/in.h:定义数据结构sockaddr_in
arpa/inet.h:提供IP地址转换函数
netdb.h:提供设置及获取域名的函数
sys/ioctl.h:提供对I/O控制的函数
sys/poll.h:提供socket等待测试机制的函数
server_socket
服务套接字,需要我们自己定义,数值形式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。