嵌入式学习day34-网络-tcp/udp

day33练习:


客户端 与 服务器实现一个点对点聊天

tcp

客户端

clifd = socket

connect

//收 --父进程 //发 --子进程 tcp

服务器 listenfd = socket

bind

listen

connfd = accept()

//收 -- 父进程 //发 -- 子进程

client.c

#include "../head.h"

int res_fd[1]; // 只需要存储客户端socket文件描述符

int tcp_client_connect(char const *ip,char const * port)
{
    int fd = socket(AF_INET,SOCK_STREAM,0);

    if (fd < 0)
    {
        perror("socket fail");
        return -1;
    }

    res_fd[0] = fd; // 保存文件描述符用于清理
    printf("fd = %d\n",fd);

    struct sockaddr_in seraddr;
    //ip 192.168.0.150
    //port 50000
    bzero(&seraddr,sizeof(seraddr)); // 使用bzero清零
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(atoi(port)); //atoi
    seraddr.sin_addr.s_addr = inet_addr(ip);

    if ( connect(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)
    {
        perror("connect fail");
        return -1;
    }
   
    return fd;
}

// 信号处理函数
void do_handler(int signo)
{
    exit(0);
}

// 清理函数
void cleanup(void)
{
    close(res_fd[0]);
    printf("pid = %d ---cleanup ---exit---\n",getpid());
}

//./cli 192.168.0.130 50000 
int main(int argc, char const *argv[])
{
    if (argc != 3)
    {
        printf("Usage: %s <ip> <port>\n",argv[0]); 
        return -1;       
    }

    int clifd = tcp_client_connect(argv[1],argv[2]);
    if (clifd < 0)
    {
        printf("tcp_client_connect fail\n");
        return -1;
    }

    // 注册信号处理函数
    signal(SIGUSR1,do_handler);
    
    pid_t pid = fork();

    if (pid < 0)
    {
        perror("fork fail");
        return -1;
    }

    // 注册退出清理函数
    if (atexit(cleanup) != 0)
    {
        perror("atexit fail");
        return -1;
    }

    char buf[1024];

    if (pid > 0)
    {
        printf("---f -- pid = %d\n",getpid());
        while (1)
        {
            printf(">");
            fgets(buf,sizeof(buf),stdin);
            write(clifd,buf,strlen(buf)+1);
            if (strncmp(buf,"quit",4) == 0)
            {
                kill(pid,SIGKILL);
                wait(NULL);
                exit(0);
            }
        }

    }else if (pid == 0)
    {
        printf("---c -- pid = %d\n",getpid());
        while (1)
        {
            read(clifd,buf,sizeof(buf));
            if (strncmp(buf,"quit",4) == 0)
            {
                //kill(getppid(),SIGKILL);
                kill(getppid(),SIGUSR1); // 使用SIGUSR1信号通知父进程退出
                exit(0);
            }
            
            printf("cli buf: %s\n",buf);
        }
    }

    // 程序不会执行到这里,但为了完整性保留
    close(clifd);
    return 0;
}

sever.c

#include "head.h"

int res_fd[2];

int tcp_accept(char const*ip,char const * port )
{
    //step1 socket 
    int fd = socket(AF_INET,SOCK_STREAM,0);

    if (fd < 0)
    {
        perror("socket fail");
        return -1;
    }
	res_fd[0] = fd;
    printf("fd = %d\n",fd);

    struct sockaddr_in seraddr;
    //ip 192.168.0.150
    //port 50000
    bzero(&seraddr,sizeof(seraddr));
    seraddr.sin_family = AF_INET;
    seraddr.sin_port = htons(atoi(port));
    seraddr.sin_addr.s_addr = inet_addr(ip);

    if (bind(fd,(const struct sockaddr *)&seraddr,sizeof(seraddr)) < 0)
    {
        perror("connect fail");
        return -1;
    }
    if (listen(fd,5) < 0)
    {
        perror("listen fail");
        return -1;
    }

    int connfd = accept(fd,NULL,NULL);
    if (connfd < 0)
    {
        perror("accept fail");
        return -1;
    }

	res_fd[1] = connfd;
	return connfd;
}

void do_handler(int signo)
{
	exit(0);
}

void cleanup(void)
{
	close(res_fd[0]);
	close(res_fd[1]);

	printf("pid = %d ---cleanup ---exit---\n",getpid())
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值