C语言Linux下TCP通信

2020年01月21日 159点热度 3人点赞 0条评论

预编译指令:

#include<sys/types.h>
#include<sys/socket.h>

tcp通信分为两部分 ,服务端和客户端;

服务端

1.创建socket

2.创建协议地址族

3.绑定(把socket与协议地址族绑定)

4.监听

5.等待客户端连接(将客户端的信息保存起来)

6.通信

7.关闭socket

8.清理协议 

客户端

客户端:

1.创建socket 

2.创建服务器协议地址族 

3.连接服务器 

4.通信 

5.关闭socket 

6.清理协议

1.创建socket

创建socket在客户端和服务端都有,套接字是用来通信的接口,收发数据都要通过socket来实现,创建套接字要用到socket函数。

Linux下一切设备,文件,链接都是文件,所以socket也是一个文件,同时Linux下如果程序打开文件的话,那么这个打开的文件就可以用一个int类型的代号表示,这个就是文件描述符。每个进程都有一张进程级的文件描述符表,POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号码。

比如,c命令行程序在运行之后会自动打开三个文件:标准输入stdin,标准输出stdout,标准错误stderr。他们的文件描述符分别是0,1,2,这时候如果我们再打开一个文件,那么这个文件的文件描述符就是3。

再来看看socket函数的原型:
int socket(int protofamily, int type, int protocol);

返回值是一个int类型的,代表文件描述符。

第1个参数

 
名称 目的
AF_INET IPv4网络通信
AF_INET6 IPv6网络通信
AF_PACKET 链路层通信
AF_UNIX, AF_LOCAL 本地通信

第2个参数

 
说明
SOCK_STREAM 字节流套接字
SOCK_DGRAM 数据报套接字
SOCK_SEQPACKET 有序分组套接字
SOCK_RAW 原始套接字

tcp协议要填第一个

第3个参数

 
IPPROTO_TCP IPPTOTO_UDP IPPROTO_SCTP IPPROTO_TIPCTCP
TCP传输协议 UDP传输协议 STCP传输协议 TIPC传输协议

2.创建协议地址族

协议地址族就是sockaddr_in结构体。 包括ip地址,网络端口,通信协议。用法:

socket_in addr;
addr.sin_family= AF_INET//协议版本
addr.sin_addr.S_un.S_addr=inet_addr("XXX.XXX.XXX.XXX");//ip地址(整数类型)
addr.sin_port=htons(10086);//端口号(字节序)
//注意
//htons这里所作的是将整型变量从主机字节顺序转变成网络字节顺序,因为储存方式不同
//inet_addr因为ip实际上是以串整数但是我们为了好记平时都用数点格式所以这个函数是用来转换为数字的

3.绑定

绑定是指将协议地址族和套接字绑定。

//原型:
int bind(int sockfd,const struct sockaddr, socklen_t addrlen);//绑定函数 绑定失败返回-1

4.监听

int listen(int fd,int backlog)//监听失败返回-1第一个参数表示文件描述符,第二个与服务端能处理的三次握手处理队列有关

5.等待客户端连接

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);
返回值是一个文件描述符,可以与客户端通信的套接字,第一个参数是服务器的套接字,第二个参数是一个传出参数,用来接收客户端的协议地址族,第三个参数是个传入传出参数,需要事先赋值 一般等于sizeof(struct sockaddr_in)

6.通信

通信有两个基本的操作,接收远端发来的数据,向远端发送数据。需要如下两个函数

1.recv

ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);

函数返回值是接收数据的大小,第一个参数文件描述符,函数从它接收数据,第二个是要接收数据的缓冲区地址,第三个是接收数据的最大大小,第四个一般置零

2.send

ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);

用法同recv

7.关闭socket

函数原型int closesocket(SOCKET s);

另外客户端还有连接操作 connect:

connect

int connect(SOCKET s, const struct sockaddr * name, int namelen);

表示连接服务器。

Danny

我就如一粒石子,在随波逐流中,逐渐冲蚀了自己的棱角,变光滑,也变丑陋。

文章评论