话不多说,代码自取
客户端代码:
#include"common.h"
struct stu
{
int id;
char name[32];
};
int main()
{
int fd,ret;
struct stu s;
struct sockaddr_in saddr;
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
perror("socket create");
return -1;
}
saddr.sin_family=AF_INET ;
saddr.sin_port=htons(8800) ;
saddr.sin_addr.s_addr=inet_addr("127.0.0.1") ;
ret=connect(fd,(struct sockaddr*)&saddr,sizeof(saddr));
if(ret<0)
{
perror("connect");
close(fd);
return -1;
}
while(1)
{
printf("please input id and name\n");
scanf("%d %s",&s.id,s.name);
ret=write(fd,&s,sizeof(struct stu));
if(ret<0)
{
perror("write");
}
}
close(fd);
}
服务端代码:
#include"common.h"
struct stu
{
int id;
char name[32];
};
int fun(int nfd)
{
int ret;
struct stu s;
ret=read(nfd,&s,sizeof(struct stu));
if(ret<0)
{
perror("read");
}
else if(ret==0)
{
printf("tcp broken.\n");
}
else
{
printf("id:%d name:%s\n",s.id,s.name);
}
return ret;
}
int tcp_ser_init(char *ip,unsigned short port)
{
int fd,ret;
struct sockaddr_in saddr;
fd=socket(AF_INET,SOCK_STREAM,0);
if(fd<0)
{
return -1;
}
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=inet_addr(ip);
printf("bind\n");
ret=bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));
if(ret<0)
{
perror("bind");
close(fd);
return -1;
}
printf("listen\n");
ret=listen(fd,20);
if(ret<0)
{
perror("listen");
close(fd);
return -1;
}
return fd;
}
int main()
{
int fd,nfd,efd,tfd;
int ret,num;
int addr_len;
struct stu s;
struct sockaddr_in caddr;
struct epoll_event ev,evs[20];
fd=tcp_ser_init("127.0.0.1",8800);
if(fd<0)
{
printf("tcp_ser_init error.\n");
return -1;
}
efd=epoll_create(256);
if(efd<0)
{
perror("epoll create");
close(fd);
return -1;
}
ev.events=EPOLLIN;
ev.data.fd=fd;
epoll_ctl(efd,EPOLL_CTL_ADD,fd,&ev);
while(1)
{
printf("epoll wait\n");
num=epoll_wait(efd,evs,20,-1);
printf("epoll wait over num=%d\n",num);
if(num<0)
{
perror("epoll wait");
break;
}
for(int i=0;i<num;i++)
{
tfd=evs[i].data.fd;
if(tfd==fd)
{
printf("accept\n");
addr_len=sizeof(caddr);
nfd=accept(fd,(struct sockaddr*)&caddr,&addr_len);
if(nfd<0)
{
perror("accept");
continue;
}
ev.events=EPOLLIN;
ev.data.fd=nfd;
epoll_ctl(efd,EPOLL_CTL_ADD,nfd,&ev);
}
else
{
ret=fun(tfd);
if(ret<=0)
{
if(ret==0)
{
close(tfd);
ev.events=EPOLLIN;
ev.data.fd=nfd;
epoll_ctl(efd,EPOLL_CTL_DEL,nfd,&ev);
}
}
}
}
}
close(fd);
}
头文件(偷个懒,包含了很多常用的):
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <wait.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <time.h>
#include <stdarg.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/select.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include<sys/epoll.h>