TCP编程流程

目录

1、主机字节序列和网络字节序列

2、套接字地址结构

 3、IP地址转换函数

4、TCP协议编程:

(1)服务器端:

(2)客户端:


1、主机字节序列和网络字节序列

主机字节序列分为大端字节序和小端字节序

大端字节序是指一个整数的高位字节存储在内存的低地址处,低位字节序列存储在内存的高地址处。

小端字节序是指整数的高位字节存储在高地址处,低位字节序列存储在内存的低地址处。

网路字节序列:大端字节序列,转换为大端:htons()

2、套接字地址结构

通用套接字地址结构:

struct sockaddr

{

sa_family_t sa_family;

char  sa_date[14];

}

传的时候会根据需要的类型,传递参数。

 3、IP地址转换函数

ipv4地址直接按的转换:

int_addr_t inet_addr(const char *cp);//把字符串表示的IPV4地址转换为网络字节序

char*inet_ntoa(stuct in_addr in)//把网络字节序转换为字符串表示的

4、TCP协议编程:

(1)服务器端:

创建套接字:socket()

给套接字指定地址(绑定)IP+端口:bind()

开机 、监听队列(不阻塞):listen()

接受链接:accept()

接收数据:recv()

发送数据:send()

关闭链接:close()

服务器端:
int main()
{
//创建套接字
int sockfd=socket(AF_INET,SOCK_STREAM,0)
//                        协议版本    
//创建失败就返回
if(sockfd==-1)
{
exit(1);;
}

//指定服务器的ip和端口
struct sockaddr_in saddr,caddr;//套接字的地址,监听套接字
//清空服务器端
memset(&saddr,0,sizeof(saddr));//制空
//填充ip和端口
saddr.sin_family=AF_INET;
saddr.sin_port=htons(6000);//1024以内知名端口,4096以内保留端口,临时端口(5000+)
saddr.sin_addr.s_addr=inet_addr("127.0.0.1");//ip地址


int res=bind(sockfd,(sockaddr*)&saddr,sizeof(saddr));
if(res==-1)
{
printf("bind err\n");
exit(1);
}

//设置监听队列

res=listen(scokfd,5);
//          套接字  监听队列长度
if(res==-1)
{
exit(1);
}

//接受链接
while(1)
{
//获取客户端的套接字地址的长度
    socklen_t len=sizeof(caddr);
//连接套接字
    int c=accept(sockfd,(struct sockaddr*)&caddr,&len);
    if(c<0)
    {
        continue;
    }

    printf("acceptc=%d,ip=%s,port=%d",c,inei_ntoa(caddr.sin_addr),ntohs(caddr.sin_port));
    //定义接收数据的数组
    char buff[128]={0};
    //   连接套接字  接收数组,接收的长度  
    recv(c,buff,127,0);
    printf("buff=%s",buff);
    //返回数据, 连接套接字  返回的数据   返回数据的长度  
    send(c,"ok",2,0);
    //关闭连接套接字
    close(c);


}

(2)客户端:

创建套接字:socket()

向服务器发起链接:connect()

给服务端发送数据:send()

接收服务端发送的数据:recv()

关闭链接:close()

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <arpa/inet.h>



//客户端
int main()
{
    //创建套接字
    int sockfd=socket(AF_INET,SOCK_STREAM,0);
    //判断是否创建成功
    if(sockfd==-1)
    {
        exit(1);
    }

    //绑定套接字地址
    struct sockaddr_in saddr;
    //套接字清空
    memset(&saddr,0,sizeof(saddr));
   
    saddr.sin_family=AF_INET;
    //绑定端口
    saddr.sin_port=htons(6000);
    //绑定IP地址
    saddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    
    //向服务器发起连接
    int res=connect(sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
    if(res==-1)
    {
        printf("connect err\n");
        exit(1);
    }

    printf("input\n");

    char buff[128];
    fgets(buff,128,stdin);
    //向服务器发送数据
    send(sockfd,buff,strlen(buff),0);
    //将buff制空
    memset(buff,0,sizeof(buff));

    //接收服务端返回的数据
    recv(sockfd,buff,127,0);
    //输出服务端返回的数据
    printf("buff=%s",buff);
    //关闭套接字
    close(sockfd);
    exit(0);


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值