利用epoll实现linux下服务器和客户端之间的通信

qq_26490289 2016-06-23 05:35:40
服务器和客户端能实现正常的连接,但无法实现通信。求原因。

客户端代码
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
int client_sockfd;
int len;
struct sockaddr_in remote_addr;
char buf[BUFSIZ];
memset(&remote_addr,0,sizeof(remote_addr));
remote_addr.sin_family=AF_INET;
remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
remote_addr.sin_port=htons(8000);

if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return -1;
}


if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr_in))<0)
{
perror("connect");
return 1;
}
printf("connected to server\n");
int epfd=epoll_create(10);
struct epoll_event ev;
struct epoll_event ev_r[20];
int nfds,i,n;
ev.data.fd=client_sockfd;
ev.events=EPOLLIN|EPOLLOUT;
epoll_ctl(epfd,EPOLL_CTL_ADD,client_sockfd,&ev);
while(1)
{
nfds=epoll_wait(epfd,ev_r,20,-1);
for(i=0;i<nfds;++i){
if(ev_r[i].events & EPOLLOUT){
memset(buf,0,sizeof(buf));
gets(buf);
write(client_sockfd, buf, sizeof(buf));

}
if(ev_r[i].events & EPOLLIN){
memset(buf, 0, sizeof(buf));
read(client_sockfd, buf, sizeof(buf));
printf("sever:%s\n",buf);
}
}
}
close(epfd);
close(client_sockfd);
return 0;
}

服务器代码:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
#include <fcntl.h>




int main(){
int listenfd,connfd;
struct sockaddr_in server;
char ptr[1024];
memset(&server,0,sizeof(server));
server.sin_family=AF_INET;
server.sin_port = htons(8000);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket()");
exit(1);
}

if(bind(listenfd, (struct sockaddr *)&server, sizeof(server)) < 0){
perror("bind()");
exit(1);
}
if(listen(listenfd, 5) < 0){
perror("listen()");
exit(1);
}
int epfd=epoll_create(10);
struct epoll_event ev;
struct epoll_event ev_r[20];
int nfds,i,n;
ev.data.fd=listenfd;
ev.events=EPOLLIN|EPOLLOUT|EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);
while(1){
nfds=epoll_wait(epfd,ev_r,20,-1);
for(i=0;i<nfds;i++){
int fd=ev_r[i].data.fd;
if(fd==listenfd){
if((connfd=accept(listenfd,NULL,NULL))<0){
perror("accpet()");
exit(1);
}
printf("accept client %s\n",inet_ntoa(server.sin_addr));
continue;
}
;
if(ev_r[i].events & EPOLLIN){
n = read(fd, ptr, sizeof(ptr));
if(n < 0){
perror("read()");
close(fd);
continue;
}
if(n==0){
close(fd);
}
else{
ptr[n]='\0';
printf("client:%s\n",ptr);
}
}
else if(ev_r[i].events & EPOLLOUT){
memset(ptr,0,sizeof(ptr));
gets(ptr);
write(fd, ptr, strlen(ptr));
}

else if(ev_r[i].events & EPOLLET ){
printf("client leave");
}
}
}
close(epfd);
close(connfd);
close(listenfd);
return 0;
}

...全文
131 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-06-23
  • 打赏
  • 举报
回复
建议楼主先学会使用抓包软件比如wireshark

69,380

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧