9.11 tcp编程流程 tcp客户端
tcp客户端编程流程:
ser 服务器端
socket()
bind() ip+port
listen()
accept()
recv()
send()
close()
cli 客户端
socket()
connect()
send()
recv()
close()
代码实现:
(ser.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0); //创建监听套接字
assert(sockfd != -1);
struct sockaddr_in saddr,caddr; //服务器ip port 客户端ip port (套接字地址)
memset(&saddr,0,sizeof(saddr)); //清空套接字
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000); //1024 知名端口 4096 保留端口 临时端口
saddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //测试的地址 inet_addr()转换方法
int res = bind(sockfd,(struct sockddr*)&saddr,sizeof(saddr)); //绑定 命名套接字
assert(res != -1);
res = listen(sockfd,5); //5指的是监听已完成三次握手的监听队列的大小
assert(res != -1);
while(1)
{
int len = sizeof(caddr);
int c = accept(sockfd,(struct sockaddr*)&caddr.&len); //接受连接 可能阻塞
if(c<0)
{
continue;
}
printf("accept c=%d\n",c); //c为连接套接字 接收客户端数据
while(1)
{
char buff[128] = {0};
int n = recv(c,buff,127,0); //recv返回值 ==0 说明对端关闭了
if(n <= 0)
{
break;
}
printf("buff(%d)=%s\n",n,buff);
send(c,"ok",2,0);
}
close(c);
printf("client close\n");
}
}
(步骤:创建套接字 去连接 发数据 收数据)
绑定套接字的意义:指定套接字的ip和端口
listen() 创建监听序列 1. 未完成三次握手 2.已完成三次握手
listen(sockfd,5) 已完成三次握手序列的长度(最多)为5
c=accept() c为连接套接字
三次握手用来建立连接 发生在connect()
(cli.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0); //创建套接字
assert(sockfd != -1);
//bind() //可以绑定 但一般不绑定 不指定客户端的ip和端口 系统自动分配临时端口号
struct sockaddr_in saddr;
memset(&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int res = connect(sockfd,(struct sockddr*)&saddr,sizeof(saddr)); //三次握手
assert(res != -1);
while(1)
{
char buff[128] = {0};
printf("input:\n");
fgets(buff,128,sdin);
if(strcmp(buff,"end",3) == 0)
{
break;
}
send(sockfd,buff,strlen(buff),0);
memset(buff,0,sizeof(buff));
recv(socked,buff,127,0);
printf("buff=%s\n",buff);
}
close(sockfd);
}
命令:netstat -natp (显示tcp信息 ip 端口)
命令:ifconfig (查看ip地址信息)
命令:ping 192.168.43.15 (检测与此ip是否连通) 显示为时间则连通