Linux学习 第二十八天 (TCP编程)

上次我们了UDP编程,今天我们说一下TCP编程;

在TPC/IP协议的传输层中,有UDP协议和TPC协议,这二者的区别如下:

    1.不安全不可靠的传输方式
    2.UDP资源开销小,实现机制简单 
    3.UDP是无连接的 

UDP不安全,不可靠资源开销小,(包头8字节)实现机制简单(只管发送)无连接
TCP安全可靠(三次握手,四次挥手)资源开销大实现机制复杂(确保发送成功)

 

IPC协议的编程方式:

发送端:

1.创建套接字(socket)

2.发送三次握手连接请求 (connect)

3.发送(send)

4.接收(recv)

5.关闭套接字(close)

接收端:

1.创建套接字(socket)

2.绑定(bind)

3.监听,让三次握手排队等待(listen)

4.处理等待的套接字(accep)

5.发送(send)

6.接收(recv)

7.关闭(close)

这里是一个主机端(接收端)的代码(头文件没有加):



int main(void)
{
    int sockfd = 0;
    int ret = 0;
    int cnt = 0;
    char temp[1024] = {0};
    size_t nsize;
    struct sockaddr_in myaddr;

    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("fail to socket\n");
        return -1;
    }
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(40000);
    myaddr.sin_addr.s_addr = inet_addr("192.168.0.177");
    ret = bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
    if(-1 == ret)
    {
        perror("fail to bind\n");
        return -1;
    }
    ret = listen(sockfd,3);
    if(-1 == ret)
    {
        perror("fail to listen\n");
        return -1;
    }
    cnt = accept(sockfd,NULL,NULL);
    if(-1 == cnt)
    {
        perror("fail to accept\n");
        return -1;
    }
    //收发
    nsize = recv(cnt,temp,sizeof(temp),0);
    if(-1 == nsize)
    {
        return -1;
    }
    printf("接收到:%s\n",temp);

    memset(temp,0,sizeof(temp));
    fgets(temp,sizeof(temp),stdin);
    temp[strlen(temp)-1] = '\0';
    nsize = send(cnt,temp,strlen(temp),0);
    if(-1 == nsize)
    {
        return -1;
    }
    printf("发送成功!\n");
    
    close(cnt);
    close(sockfd);
    return 0;
}

这是发送端的代码:

#include "../../diaoyong.h"

int main(void)
{
    int sockfd = 0;
    int con = 0;
    size_t nsize;
    char temp[1024] = {0};
    struct sockaddr_in send1;

    //创建
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(-1 == sockfd)
    {
        perror("fail to socket\n");
        return -1;
    }

    send1.sin_family = AF_INET;  //对方的信息
    send1.sin_port = htons(40000);
    send1.sin_addr.s_addr = inet_addr("192.168.0.119");
    con = connect(sockfd,(struct sockaddr *)&send1,sizeof(send1));
    if(-1 == con)
    {
        perror("fail to connect\n");
        return -1;
    }
    //发送
    //while(1)
    //{
        //memset(temp,0,sizeof(temp));
        fgets(temp,sizeof(temp),stdin);
        temp[strlen(temp)-1] = '\0';
        nsize = send(sockfd,temp,strlen(temp),0);
        if(-1 == nsize)
        {
            return -1;
        }
        printf("发送成功!\n");

        //接收
        memset(temp,0,sizeof(temp));
        nsize= recv(sockfd,temp,sizeof(temp),0);
        if(-1 == nsize)
        {
            return -1;
        }
        printf("接收到%ld个字节,内容为:%s\n",nsize,temp);
    //}

    close(sockfd);
    return 0;
}

结束!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值