文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>测试题(二)

测试题(二)

时间:2006-11-30  来源:Angel lee

实现网络TCP/IP通信程序,使用任意开发工具。具体要求是:

一个服务器端程序,两个客户端程序。

服务器端程序的功能是:根据不同客户端的连接实现数据的转发。可以实现多个客户端的长连接。

第一个客户端只负责不停的将数据发送到服务器端。
另一个客户端负责从服务器端接收第一个客户端发送的数据。

此题自己刚开始做时还有点心慌的(水平还烂了点吧),不过今天想来出这题挺有趣的,至少能算过最原始的聊天程序吧,第一个客户端client01负责写,第二个客户端client02负责收消息.代码也发上来吧.

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/in.h>

/* Define Server Port Number */
#define OURPORT 12345

 

void do_service(int sd)
{
      FILE *fp;
      char recvbuf[8196] = "";        /* 服务器端接收客户传过来的信息的缓冲区 */
      char sendbuf[8196] = "";        /* 返回给客户端的数据 */
      int n;  // char temp[80] = "\0";       
    /* 从客户端读取数据 */
    if ((n=(read(sd,recvbuf,sizeof(recvbuf))))>0)
    {
          /* 根据客户端传过来的数据 */
          if(strncmp(recvbuf,"recv",4)==0) /*向客户端发送数据*/
          {
              if((fp=fopen("temp.res","r"))==NULL)
              {
                  printf("read error");
                  exit(0);
              }
             // fseek(fp,0,SEEK_SET);
              while(!feof(fp))
              {
                  if((n=read(fileno(fp),sendbuf,sizeof(sendbuf)))>=0)
                     write(sd, sendbuf, n);
              }
               exit(0);
          }
          if(strncmp(recvbuf,"recv",4))                        /*接受客户端数据*/
          {
              if ((fp = fopen("temp.res", "w")) == NULL)
             {
                       printf("Open file error!\n");
                       exit(1);
             }
              write(fileno(fp),recvbuf,n);

              while((n=read(sd,recvbuf,sizeof(recvbuf)))>0)
              {

                       write(fileno(fp),recvbuf,n);

              }
              exit(0);
          }
            //remove("temp.res");                    /* 删除temp.res文件 */
     }
   
    exit(0);
}

int main(int argc, char* argv[])
{
    
    int sd, newsd;   /*Define Socket handle */
    struct sockaddr_in *server_addr;  /* Socket Address Struct */
    int slen;
   
    if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        printf("Create Socket Error!\n");
        return (-1);
    }
 
    /* Fill Socket Address Struct */
    server_addr = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in));
    server_addr->sin_family = AF_INET;
    server_addr->sin_port = htons(OURPORT);
    server_addr->sin_addr.s_addr = htonl(INADDR_ANY);
    slen = sizeof(struct sockaddr_in);

    /* Bind Port */
    if (bind(sd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) < 0) {
        printf("Bind Error! \n");
        return (-1);
    }

    /* Listen Port */
    if (listen(sd, 8) == -1) {
        printf("Listen Error! \n");
        return (-1);
    }

    signal(SIGCHLD, SIG_IGN);                     /* 不产生僵尸进程 */
    for (;;) {   /* Wait Client Connecting */
        slen = sizeof(struct sockaddr_in);
        newsd = accept(sd, (struct sockaddr *)server_addr, &slen);
        if (newsd == -1) {
            printf("Accept Error! \n");
            break;
        }

        switch (fork()) {
            case 0:
                do_service(newsd);                /* 子进程 */        
                break;
            case -1:                              /* fork出错 */
                printf("Fork Error!\n");
                break;
            default:
                close(newsd);                     /* 父进程 */
                  break;
        }
    }
    close(sd);
    free(server_addr);
}

client01.c

#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/* Define Server Port Number */
#define OURPORT 28888
#define MAXLINE 4096
void
str_cli(FILE *fp, int sockfd)
{
    char    sendline[MAXLINE];

    while (fgets(sendline, MAXLINE, fp) != NULL)
    {

        write(sockfd, sendline, strlen(sendline));
      
     }
}
int
main(int argc, char **argv)
{
    int                 sockfd;
    struct sockaddr_in  servaddr;

    if (argc != 2)
        {printf("usage: tcpcli <IPaddress>");exit(0);}

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(OURPORT);
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

    connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    str_cli(stdin, sockfd);     /* do it all */

    exit(0);
}

client02.c

#include <arpa/inet.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>
#include <netdb.h>
#include <netinet/in.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/* Define Server Port Number */
#define OURPORT 28888
#define MAXLINE 4096
void
str_cli(FILE *fp, int sockfd)
{
    char    recvline[MAXLINE];int n=0;
       
        write(sockfd,"recv", 4);
        while ((n=read(sockfd, recvline, MAXLINE)) >0)
        {
            recvline[n]=0;
            fputs(recvline,stdout);
                // perror("fputs");
                // exit(0);
           
        }
     
}

int
main(int argc, char **argv)
{
    int                 sockfd;
    struct sockaddr_in  servaddr;

    if (argc != 2)
        {printf("usage: tcpcli <IPaddress>");exit(0);}

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(OURPORT);
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

    connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

    str_cli(stdin, sockfd);     /* do it all */

    exit(0);
}

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载