linux 下 基于TCP下的通信

1.完成这个tcp通信,一般要知道了tcp的三次握手,和四次挥手

TCP建立连接——三次握手
建立TCP连接的过程又称三次握手,指建立一个TCP连接的过程时,需要接受端和发送端共发送3个数据报文,以确立连接的建立。在套接字的编程中,这一个过程由发送端发送连接来触发,三次握手交互流程如图

 

 

TCP断开连接——四次挥手
断开TCP连接又称四次挥手关闭连接,指断开TCP连接时,需要接受端和发送发送4个数据确认连接的断开。在套接字编程中,这一过程由接收端或发送端任一方执行关闭连接来触发,四次挥手交互流程如图

 

 实现TCP的基本流程

1.服务器需要具备一个可以确知的地址或端口,便于客户端连接服务器

2.将创建的socket属性由主动变成被动,让服务器等待客户端主动连接

3.对于面向连接的TCP,客户端和服务器完成三次握手建立连接才意味着通信的开始


源码如下

“tcp_server.c”

#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv)
{
unsigned short port = 8000;
int log;
if(argc>1)
{
port = atoi(argv[1]);
}
pid_t pid;
pid =fork();
if(pid<0)
{
perror("creart is error");
}
else if(pid == 0)
{
printf("i am child\n");
} else
{
printf("i am parent\n");
}
int sfd = 0;

//创建套接字
sfd=socket(AF_INET,SOCK_STREAM,0); //设置UDP报文传输 0表示默认 SOCK_DGRAM 默认使用UDP SOCK_STREAM 表示使用tcp
//其中第三位 0 是调用方式标志位,设置socket通方式,比如非阻塞
if(sfd < 0)
{
perror("create tcp error");
exit(-1);
}
//初始化本地地址
struct sockaddr_in my_addr;
bzero(&my_addr,sizeof(my_addr));
//merset(&my_addr,0,sizeof(my_addr));等同于bzero函数
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(port);
my_addr.sin_addr.s_addr=htons(INADDR_ANY);//默认使用本地的IP地址
//绑定到本地的ip地址
log = bind(sfd,(struct sockaddr * )&my_addr,sizeof(my_addr));
if(log != 0)
{
printf("bind is successful");
//close(sfd);
//exit(-1);
}
log = listen(sfd,10);
if(log != 0)
{
printf("listen is successful");
//close(sfd);
//exit(-1);
}
printf("listen client @port = %d \n",port);

struct sockaddr_in client_addr;
char cli_ip[INET_ADDRSTRLEN]="";
socklen_t cliaddr_len = sizeof(client_addr);
int connid;
connid=accept(sfd,(struct sockaddr *)&client_addr,&cliaddr_len);
if(connid<0)
{
perror("accept is error");
exit(-1);
}
inet_ntop(AF_INET,&client_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);
printf("client ip is %s ,port is %d\n",cli_ip,ntohs(client_addr.sin_port));
while (1)
{
char rec_buf[1024]="";

  //接受信息
if(recv(connid,rec_buf,sizeof(rec_buf),0)>0)
{
printf("receiver data:\r\n");
printf("%s\r\n", rec_buf);
printf("receiver client successful\n");
char send_buf[1024];
//发送信息
printf("send data:\n");
fgets(send_buf,sizeof(send_buf),stdin);
send_buf[strlen(send_buf)-1];
int sendsize;
if((sendsize=send(connid,send_buf,strlen(send_buf),0))>0)
{
printf("send client successful\n");
}

}

}
close(connid);
close(sfd);
return 0;

}

“tcp_client.c”


#include<stdio.h>
#include<stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc,char **argv)
{
unsigned short port = 8000;
if(argc>1)
{
port = atoi(argv[1]);
}
pid_t pid;
pid =fork();
if(pid<0)
{
perror("creart is error");
}
else if(pid == 0)
{
printf("i am child\n");
} else
{
printf("i am parent\n");
}
int sfd = 0;
sfd=socket(AF_INET,SOCK_STREAM,0); //设置TDP报文传输 0表示默认 SOCK_DGRAM 默认使用UDP SOCK_STREAM 表示使用tcp
//其中第三位 0 是调用方式标志位,设置socket通方式,比如非阻塞
if(sfd < 0)
{
perror("create tcp error");
exit(-1);
}
//初始化服务器地址等同于目的地址
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
//merset(&my_addr,0,sizeof(my_addr));等同于bzero函数
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(port);

char cli_ip[INET_ADDRSTRLEN]="";//重定义它为INET_ADDRSTRLEN=16
socklen_t cliaddr_len = sizeof(server_addr);
int connid;
connid=connect(sfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
if(connid<0)
{
perror("accept is error");
printf("%d\n",connid);
exit(-1);
}
inet_ntop(AF_INET,&server_addr.sin_addr,cli_ip,INET_ADDRSTRLEN);
printf("server_addr ip is %s ,port is %d\n",cli_ip,ntohs(server_addr.sin_port));
while (1)
{
char send_buf[1024]="";
//发送信息
printf("send data:\n");
fgets(send_buf,sizeof(send_buf),stdin);
send_buf[strlen(send_buf)-1];
int sendsize;
if((sendsize=send(sfd,send_buf,strlen(send_buf),0))>0)
{
printf("send to server successful\n");
}
char rec_buf[1024];
if(recv(sfd,rec_buf,sizeof(rec_buf),0)>0)
{
printf("receiver data:\r\n");
printf("%s\r\n", rec_buf);
printf("receiver from server successful\n");
}

}
close(connid);
close(sfd);
return 0;
}

 

posted @ 2020-12-18 11:07  成一  阅读(431)  评论(0)    收藏  举报