客户端-服务器(client-server) 贾文龙

//09嵌入式-贾文龙


#include
#include
#include
void perr_exit(const char *s)
{
        perror
(s);
       
exit(1);
} int Accept(int fd, struct sockaddr *sa, socklen_t * salenptr)
{
       
int n;
      again
:if ((n = accept(fd, sa, salenptr)) < 0) {
               
if ((errno == ECONNABORTED) || (errno == EINTR))
                       
goto again;
               
else
                        perr_exit
("accept error");
       
}
       
return n;
}
void Bind(int fd, const struct sockaddr *sa, socklen_t salen)
{
       
if (bind(fd, sa, salen) < 0)
                perr_exit
("bind error");
}
void Connect(int fd, const struct sockaddr *sa, socklen_t salen)
{
       
if (connect(fd, sa, salen) < 0)
                perr_exit
("connect error");
}
void Listen(int fd, int backlog)
{
       
if (listen(fd, backlog) < 0)
                perr_exit
("listen error");
}
int Socket(int family, int type, int protocol)
{
       
int n;
       
if ((n = socket(family, type, protocol)) < 0)
                perr_exit
("socket error");
       
return n;
}

ssize_t
Read(int fd, void *ptr, size_t nbytes)
{
        ssize_t n
;
      again
:if ((n = read(fd, ptr, nbytes)) == -1) {
               
if (errno == EINTR)
                       
goto again;
               
else
                       
return -1;
       
}
       
return n;
}

ssize_t
Write(int fd, const void *ptr, size_t nbytes)
{
        ssize_t n
;
      again
:if ((n = write(fd, ptr, nbytes)) == -1) {
               
if (errno == EINTR)
                       
goto again;
               
else
                       
return -1;
       
}
       
return n;
}
void Close(int fd)
{
       
if (close(fd) == -1)
                perr_exit
("close error");
}



/* client.c */
#include
#include
#include
#include
#include "wrap.h"
#include
#include
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char *argv[])
{
       
struct sockaddr_in servaddr;
       
char buf[MAXLINE];
       
int sockfd, n;
        pid_t pid
;
        sockfd
= Socket(AF_INET, SOCK_STREAM, 0);
        bzero
(&servaddr, sizeof(servaddr));
        servaddr
.sin_family = AF_INET;
        inet_pton
(AF_INET, "127.0.0.1", &servaddr.sin_addr);
        servaddr
.sin_port = htons(SERV_PORT);
       
Connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
       
       
       
if (fgets(buf, MAXLINE, stdin) != NULL)
       
Write(sockfd, buf, strlen(buf));
       
       
       pid
=fork();
       
if (pid == 0)
       
{
       
while(1)
       
{
       
if (fgets(buf, MAXLINE, stdin) != NULL)

               
Write(sockfd, buf, strlen(buf));
       
}
       
}
       
else
       
{
       
while(1)
       
{
       n
= Read(sockfd, buf, MAXLINE);
               
if (n == 0)
                        printf
("the other side has been closed.\n");
               
else
                       
Write(STDOUT_FILENO, buf, n);
                       
}
                       
}
                       
       
Close(sockfd);
       
return 0;
       
}





/* server.c */
#include
#include
#include
#include
#include "wrap.h"
#define MAXLINE 80
#define SERV_PORT 8000
int main(int argc, char **argv)
{
       
int i, maxi, maxfd, listenfd, connfd, sockfd;
       
int nready, client[FD_SETSIZE];
        ssize_t n
;
        fd_set rset
, allset;
       
char buf[MAXLINE];
       
char out[50]="已发送成功!\n";
       
char str[INET_ADDRSTRLEN];
        socklen_t cliaddr_len
;
       
struct sockaddr_in cliaddr, servaddr;
        listenfd
= Socket(AF_INET, SOCK_STREAM, 0);
        bzero
(&servaddr, sizeof(servaddr));
        servaddr
.sin_family = AF_INET;
        servaddr
.sin_addr.s_addr = htonl(INADDR_ANY);
        servaddr
.sin_port = htons(SERV_PORT);
       
Bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
       
Listen(listenfd, 20);
        maxfd
= listenfd;       /* initialize */
        maxi
= -1;              /* index into client[] array */
       
for (i = 0; i < FD_SETSIZE; i++)
                client
[i] = -1; /* -1 indicates available entry */
        FD_ZERO
(&allset);
        FD_SET
(listenfd, &allset);
       
for (;;) {

                rset
= allset;  /* structure assignment */
                nready
= select(maxfd + 1, &rset, NULL, NULL, NULL);
               
if (nready < 0)
                        perr_exit
("select error");
                       

                       
               
if (FD_ISSET(listenfd, &rset)) {        /* new client connection */
                        cliaddr_len
= sizeof(cliaddr);
                        connfd
=
                           
Accept(listenfd, (struct sockaddr *) &cliaddr,
                                   
&cliaddr_len);
                        printf
("received from %s at PORT %d\n",
                               inet_ntop
(AF_INET, &cliaddr.sin_addr, str,
                                         
sizeof(str)),
                               ntohs
(cliaddr.sin_port));
                       
for (i = 0; i < FD_SETSIZE; i++)
                               
if (client[i] < 0) {
                                        client
[i] = connfd;     /* save descriptor */
                                       
break;
                               
}
                       
if (i == FD_SETSIZE) {
                                fputs
("too many clients\n", stderr);
                               
exit(1);
                       
}
                        FD_SET
(connfd, &allset);        /* add new descriptor to set */
                       
if (connfd > maxfd)
                                maxfd
= connfd; /* for select */
                       
if (i > maxi)
                                maxi
= i;       /* max index in client[] array */
                       
if (--nready == 0)
                               
continue;       /* no more readable descriptors */
               
}
               
for (i = 0; i <= maxi; i++) {   /* check all clients for data */
                       
if ((sockfd = client[i]) < 0)
                               
continue;
                       
if (FD_ISSET(sockfd, &rset)) {
                               
if ((n = Read(sockfd, buf, MAXLINE)) == 0) {    /* connection closed by client */
                                       
Close(sockfd);
                                        FD_CLR
(sockfd, &allset);
                                        client
[i] = -1;
                               
}
                                               
int cc=0;
                                       
for (cc=0; cc < 1000; cc++)
                                       
{
                                       
if(sockfd == client[cc])

                                       
Write(sockfd, out, 50);
                                       
else
                                       
Write(client[cc],buf, n);
                                       
                                       
}
                                       
Write(1, buf, n);
                                       
                                                                               
                               
}
                       
}
               
}
       
}

<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(846) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
posted @ 2016-03-30 10:26  张同光  阅读(270)  评论(0编辑  收藏  举报