主服务器程序,创建SOCKET并共享出SOCKET,同时接收处理客户请求。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOCAL_SOCKET "/tmp/sharesock"
int sharefd;
int flag = 0;
struct in_addr getlocalip()
{
int fd,ret;
struct ifreq ifr;
struct in_addr myip;
struct sockaddr_in* addr;
fd = socket(AF_INET,SOCK_PACKET,htons(0x0806));
if(fd <= 0)
{
perror("socket");
return ;
}
strcpy(ifr.ifr_name,"eth0");
ret = ioctl(fd,SIOCGIFADDR,&ifr);
if(ret != 0)
{
perror("ioctl");
close(fd);
return ;
}
addr = (struct sockaddr_in*)&ifr.ifr_addr;
myip = addr->sin_addr;
printf("ip:%s \n",inet_ntoa(myip));
return myip;
}
void sharethread(int fd)
{
int ret;
int acceptfd;
struct sockaddr peeraddr;
fd_set readfds,writefds;
int size;
struct msghdr msg;
struct iovec iov[1];
union{
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
}control_un;
struct cmsghdr* cmptr;
while(!flag);
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);
cmptr = CMSG_FIRSTHDR(&msg);
cmptr->cmsg_len = CMSG_LEN(sizeof(int));
cmptr->cmsg_level = SOL_SOCKET;
cmptr->cmsg_type = SCM_RIGHTS;
msg.msg_name = NULL;
msg.msg_namelen = 0;
iov[0].iov_base = "";
iov[0].iov_len = 1;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
size = sizeof(peeraddr);
while(1)
{
while(!flag);
acceptfd = accept(fd,&peeraddr,&size);
if(acceptfd <= 0)
{
perror("accept");
close(fd);
return ;
}
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(acceptfd,&writefds);
ret = select(acceptfd+1,NULL,&writefds,NULL,NULL);
if(ret <= 0)
{
perror("select");
close(fd);
close(acceptfd);
return ;
}
if(FD_ISSET(acceptfd,&writefds))
{
if(flag)
{
*((int*)CMSG_DATA(cmptr)) = sharefd;
ret = sendmsg(acceptfd,&msg,0);
if(ret <= 0)
{
perror("sendmsg");
close(fd);
close(acceptfd);
return ;
}
else
{
close(acceptfd);
}
}
else
{
continue;
}
}
}
}
int main(int argc,char* argv[])
{
int ret;
int listenfd,fd,localfd;
struct sockaddr_in servaddr,peeraddr;
struct sockaddr localaddr;
int sockopt = 1;
fd_set readfd,writefd;
pthread_t threadid;
pthread_attr_t attr;
localfd = socket(AF_UNIX,SOCK_STREAM,0);
if(localfd <= 0)
{
perror("socket");
return localfd;
}
localaddr.sa_family = AF_UNIX;
strcpy(localaddr.sa_data,LOCAL_SOCKET);
ret = setsockopt(localfd,SOL_SOCKET,SO_REUSEADDR,&sockopt,sizeof(int));
if(ret != 0)
{
perror("setsockopt");
close(localfd);
return ret;
}
unlink(LOCAL_SOCKET);
ret = bind(localfd,(struct sockaddr*)&localaddr,strlen(localaddr.sa_data)+sizeof(localaddr.sa_family));
if( ret != 0)
{
perror("bind localfd");
close(localfd);
return ret;
}
ret = listen(localfd,5);
if(ret != 0)
{
perror("listen");
close(localfd);
return ret;
}
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
ret = pthread_create(&threadid,&attr,(void*)sharethread,(void*)localfd);
listenfd = socket(AF_INET,SOCK_STREAM,0);
if(listenfd <= 0)
{
perror("socket");
close(localfd);
return listenfd;
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5678);
servaddr.sin_addr = getlocalip();
//servaddr.sin_addr.s_addr = htonl(servaddr.sin_addr.s_addr);
//servaddr.sin_addr.s_addr = htonl(inet_addr("192.168.1.10"));
//servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
ret = bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr));
if(ret != 0)
{
perror("bind listenfd");
printf("return[%d]\n",ret);
close(localfd);
close(listenfd);
return ret;
}
ret = listen(listenfd,5);
if(ret != 0)
{
perror("listen");
close(localfd);
close(listenfd);
return ret;
}
sockopt = sizeof(peeraddr);
while(1)
{
fd = accept(listenfd,(struct sockaddr*)&peeraddr,&sockopt);
if(fd <= 0)
{
perror("accept");
close(localfd);
close(listenfd);
return fd;
}
printf("accept sucess \n");
sharefd = fd;
flag = 1;
while(1)
{
char buf[1024];
FD_ZERO(&readfd);
FD_ZERO(&writefd);
FD_SET(fd,&readfd);
ret = select(fd+1,&readfd,NULL,NULL,NULL);
if(ret <= 0)
{
perror("select");
close(localfd);
close(listenfd);
close(fd);
return ret;
}
if(FD_ISSET(fd,&readfd))
{
ret = read(fd,buf,1024);
if(ret < 0)
{
perror("read");
close(localfd);
close(listenfd);
close(fd);
return ret;
}
else if(ret == 0)
{
flag = 0;
close(fd);
break;
}
printf("recv:%s \n",buf);
}
}
}
}
接收主程序共享的SOCKET,在此SOCKET上接收处理客户发来的数据
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SHARESOCKET "/tmp/sharesock"
int main(int argc,char* argv[])
{
int ret;
int fd;
int sharefd;
char buf[1024];
int c;
struct sockaddr addr;
struct msghdr msg;
struct iovec iov[1];
union{
struct cmsghdr cm;
char control[CMSG_SPACE(sizeof(int))];
}control_un;
struct cmsghdr* cmptr;
fd_set readfds,writefds;
msg.msg_control = control_un.control;
msg.msg_controllen = sizeof(control_un.control);
msg.msg_name = NULL;
msg.msg_namelen = 0;
iov[0].iov_base = &c;
iov[0].iov_len = 1;
msg.msg_iov = iov;
msg.msg_iovlen = 1;
fd = socket(AF_UNIX,SOCK_STREAM,0);
if(fd <= 0)
{
perror("socket");
return fd;
}
addr.sa_family = AF_UNIX;
strcpy(addr.sa_data,SHARESOCKET);
ret = connect(fd,&addr,sizeof(addr));
if(ret != 0)
{
perror("connect");
close(fd);
return ret;
}
while(1)
{
ret = recvmsg(fd,&msg,0);
if(ret <= 0)
{
perror("recvmsg");
close(fd);
return ret;
}
if(((cmptr = CMSG_FIRSTHDR(&msg))!= NULL) && (cmptr->cmsg_len == CMSG_LEN(sizeof(int))))
{
if(cmptr->cmsg_level != SOL_SOCKET)
{
printf("control level err \n");
close(fd);
return -1;
}
if(cmptr->cmsg_type != SCM_RIGHTS)
{
printf("cmsg type err \n");
close(fd);
return -1;
}
sharefd = *((int*)CMSG_DATA(cmptr));
}
else
{
sharefd = -1;
printf("get err sharefd \n");
close(fd);
return -1;
}
while(1)
{
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(sharefd,&readfds);
ret = select(sharefd+1,&readfds,NULL,NULL,NULL);
if(ret <= 0)
{
perror("seletc");
close(sharefd);
close(fd);
return ret;
}
if(FD_ISSET(sharefd,&readfds))
{
ret = read(sharefd,buf,1024);
if(ret < 0)
{
perror("read");
close(sharefd);
close(fd);
return ret;
}
if (ret == 0)
{
close(sharefd);
break;
}
printf("recv:%s \n",buf);
}
}
}
}
客户端程序,连接主程序,向主程序发送请求数据。
#include
#include
#include
#include
int main(int argc,char* argv[])
{
int ret;
int fd;
struct sockaddr_in servaddr;
char buf[40];
fd_set writefds;
strcpy(buf,"hi, i am client\n");
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd <= 0)
{
perror("socket");
return fd;
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5678);
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
ret = connect(fd,(struct sockaddr*)&servaddr,sizeof(servaddr));
if(ret != 0)
{
perror("connect");
close(fd);
return ret;
}
while(1)
{
int i;
for(i = 0; i < 200; i++)
{
bzero(buf,40);
sprintf(buf,"%d hi,i came from client\n",i);
write(fd,buf,40);
}
sleep(3);
}
}
阅读(1172) | 评论(0) | 转发(0) |