简单的TCP网络程序
其流程如下:
listen()
设置监听
int listen(int sockfd, int backlog);
sockfd
:侦听套接字,socket函数的返回值;backlog
:已完成连接队列的大小;
当我们调用该函数后,也就是告诉内核,其中的程序可以接收新的连接了,(即:可以完成三次握手的过程了);- 返回值:成功返回0,失败返回-1;
- listen();声明sockfd处于监听的状态,并且最多允许有backlog个客户端处于连接等待状态,如果接收到更多的连接请求就忽略,这里设置不会太大(一般是5);
- 测试backlog为1时,它可以建立2个连接;
accept()
接收函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
sockfd
:侦听套接字,socket函数的返回值;addr
:对端的地址信息,客户端的地址信息;addrlen
:对端的地址信息,客户端地址信息的长度;- 返回值:
正常
:返回的是为新连接创建出来的套接字;
失败
:小于0;
要点:
1.accept()
函数是再三次握手完成之后进行调用的;
2.给addr参数传NULL代表不关心你客户端的地址;
3.addr是一个传出参数,accept()函数在返回时传出客户端的地址和端口号;
4.获取新连接是从“已完成连接队列”当中获取新连接;
如果已完成连接队列未空,调用该接口,执行流会被阻塞
connect()
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
sockfd
:客户端调用socket创建出来的套接字描述符;addr
:要连接的服务端的地址信息;addrlen
:地址信息的长度;
send()
发送数据
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
sockfd
:
客户端:调用socket创建出来的套接字描述符;
服务端:accpet()函数的返回值;buf
:待发送的数据;len
:发送数据的长度;flags
:0 阻塞发送;
recv()
接收数据
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sockfd
:
客户端:调用socket创建出来的套接字描述符;
服务端:accpet()函数的返回值;buf
:接收数据使用的缓冲区;len
:最大接收能力;flags
:0 阻塞接收;- 返回值:
> 0:接收了多少字节数据;
=0:对端关闭了连接;
<0:发送失败;
服务端:
svr.cpp
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
int main()
{
int listen_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(listen_sock < 0)
{
perror