day38练习
用select方式,实现tcp点对点聊天
server.c
#include "head.h"
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;
}
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;
}
return connfd;
}
int main(int argc, char const *argv[])
{
if (argc != 3)
{
printf("Usage: %s <ip> <port>\n",argv[0]);
return -1;
}
int connfd = tcp_accept(argv[1],argv[2]);
if (connfd < 0)
{
printf("tcp_accept fail");
return -1;
}
//1.准备表
fd_set readfds;
FD_ZERO(&readfds);
//2.添加 要监控的文件描述符
FD_SET(0,&readfds);
FD_SET(connfd,&readfds);
//3.准备参数
int maxfds = connfd + 1;
fd_set backfds ;
char buf[1024] = {0};
while (1)
{
backfds = readfds;
int ret = select(maxfds,&backfds,NULL,NULL,NULL);
if (ret < 0)
{
perror("select fail");
return -1;
}
int i = 0;
for (i = 0; i < maxfds;++i)
{
if (FD_ISSET(i,&backfds))
{
if (i == 0)
{
printf(">");
fgets(buf,sizeof(buf),stdin);
write(connfd,buf,strlen(buf)+1);
if (strncmp(buf,"quit",4) == 0)
{
close(connfd);
exit(0);
}
}else
{
read(connfd,buf,sizeof(buf));
if (strncmp(buf,"quit",4) == 0)
{
close(connfd);
exit(0);
}
printf("cli buf: %s\n",buf);
}
}
}
}
return 0;
}
client.c

最低0.47元/天 解锁文章
499

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



