Linux9.11 day19 tcp编程流程 tcp客户端

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是否连通) 显示为时间则连通

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值