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())

最低0.47元/天 解锁文章
1725

被折叠的 条评论
为什么被折叠?



