服务器代码
#include <stdio.h>
#include <poll.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <error.h>
#include <errno.h>
#include <sys/epoll.h>
#define maxsize 1024
#define PORT 8888
struct sockaddr_in server,client;
int listen_socket;
int len;
void socket_init()
{
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = htonl(0);
listen_socket=socket(AF_INET,SOCK_STREAM,0);
if(listen_socket < 0)
{
perror("socket:");
exit(1);
}
if(bind(listen_socket,(struct sockaddr *)&server,sizeof(server)) < 0)
{
perror("bind:");
exit(1);
}
if(listen(listen_socket,128) < 0)
{
perror("listen:");
exit(1);
}
printf("this is server\n");
printf("服务器初始化完成!\n");
}
int main()
{
int i,ret,epoll_fd,event_ret,new_fd;
char recbuf[1024],sendbuf[1024];
struct epoll_event event,events[maxsize];
len=sizeof(client);
socket_init();
event.events=EPOLLIN;
event.data.fd=listen_socket;
epoll_fd = epoll_create(maxsize);
epoll_ctl(epoll_fd,EPOLL_CTL_ADD,listen_socket,&event);
len=sizeof(client);
while(1)
{
event_ret=epoll_wait(epoll_fd,events,maxsize,-1);
for(i=0;i<event_ret;i++)
{
if(events[i].data.fd == listen_socket)
{
new_fd=accept(listen_socket,(struct sockaddr *)&client,&len);
event.data.fd=new_fd;
epoll_ctl(epoll_fd,EPOLL_CTL_ADD,new_fd,&event);
printf("客户%d已连接\n",new_fd);
continue;
}
else if(events[i].events & EPOLLIN)
{
ret=read(events[i].data.fd,recbuf,sizeof(recbuf));
if(ret==0)
{
printf("客户%d已断开连接\n",events[i].data.fd);
close(events[i].data.fd);
epoll_ctl(epoll_fd,EPOLL_CTL_DEL,events[i].data.fd,&event);
continue;
}
printf("客户机%d:%s\n",events[i].data.fd,recbuf);
strcpy(sendbuf,recbuf);
write(events[i].data.fd,sendbuf,sizeof(sendbuf));
}
}
}
close(listen_socket);
close(epoll_fd);
return 0;
}
客户端代码
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
int socket_fd;
struct sockaddr_in server;
void socket_init()
{
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
socket_fd = socket(AF_INET,SOCK_STREAM,0);
if(socket_fd < 0)
{
perror("socket:");
exit(1);
}
if(connect(socket_fd,(struct sockaddr *)&server,sizeof(server))<0)
{
perror("connect:");
exit(1);
}
}
int main()
{
char sendbuf[1024],recbuf[1024];
printf("this is client\n");
socket_init();
while(1)
{
scanf("%s",sendbuf);
if(write(socket_fd,sendbuf,sizeof(sendbuf))<0)
{
perror("write:");
exit(1);
}
if(read(socket_fd,recbuf,sizeof(recbuf))<0)
{
perror("read:");
exit(1);
}
printf("%s\n",recbuf);
}
close(socket_fd);
return 0;
}