服务端
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return -1;
}
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(5678);
addr.sin_addr.s_addr = inet_addr("192.168.0.111");
socklen_t addrlen = sizeof(addr);
if(bind(sockfd,(struct sockaddr*)&addr,addrlen))
{
perror("bind");
return -1;
}
if(listen(sockfd,10))
{
perror("listen");
return -1;
}
// 创建两个文件描述符集合
fd_set readfd,readcp;
// 清空两个文件描述符集合
FD_ZERO(&readfd);
FD_ZERO(&readcp);
// 把sockfd加到readfd中
FD_SET(sockfd,&readfd);
int maxfd = sockfd + 1;
struct timeval timeout = {5,5000000};
char buf[4096] = {};
for(;;)
{
// 每次都要重新向select传递所监控的对象
readcp = readfd;
// 监控集合中的文件描述符
int ret = select(maxfd,&readcp,NULL,NULL,&timeout);
// 返回值小于零出错,等于零超时
if(ret <= 0) continue;
for(int i=3; i<maxfd; i++)
{
// 检查sockfd 是否有新客户端连接
if(i==sockfd && FD_ISSET(i,&readcp))
{
int clifd = accept(sockfd,(struct sockaddr*)&addr,&addrlen);
if(clifd < 0) continue;
FD_SET(clifd,&readfd);
if(clifd+1 >= maxfd)
{
maxfd = clifd+1;
}
}
else if(FD_ISSET(i,&readcp))
{
int ret = recv(i,buf,sizeof(buf),0);
if(ret <= 0)
{
FD_CLR(i,&readfd);
continue;
}
printf("fd:%d recv:%s\n",i,buf);
send(i,buf,strlen(buf)+1,1);
}
}
}
}
客户端
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
printf("服务器创建socket...\n");
int sockfd = socket(AF_INET,SOCK_STREAM,0);
if(0 > sockfd)
{
perror("socket");
return -1;
}
printf("准备地址...\n");
struct sockaddr_in addr = {};
addr.sin_family = AF_INET;
addr.sin_port = htons(7777);
addr.sin_addr.s_addr = inet_addr("192.168.0.111");
socklen_t len = sizeof(addr);
printf("绑定连接服务器...\n");
if(connect(sockfd,(struct sockaddr*)&addr,len))
{
perror("bind");
return -1;
}
for(;;)
{
char buf[1024] = {};
printf(">");
gets(buf);
write(sockfd,buf,strlen(buf)+1);
if(0 == strcmp("quit",buf))
{
printf("通信结束!\n");
break;
}
printf("read:");
read(sockfd,buf,sizeof(buf));
printf("%s\n",buf);
}
close(sockfd);
}