2017-2018-1 20155223 实验三 实时系统

2017-2018-1 20155223 实验三 实时系统

实验1

学习使用Linux命令wc(1)
基于Linux Socket程序设计实现wc(1)服务器(端口号是你学号的后6位)和客户端
客户端传一个文本文件给服务器
服务器返加文本文件中的单词数

wc命令:Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
那么就是要我建立一对C/S,客户端可以发送文件,服务器读里面的单词个数。

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <fcntl.h>



// 定义包的大小为512KB

#define PACK_SIZE 1024*512



int main(int argc, char *argv[])

{

    // 设置输出缓冲

    setvbuf(stdout, NULL, _IONBF, 0);

    fflush(stdout);



    int sockfd,new_fd;

    struct sockaddr_in server_addr;

    struct sockaddr_in client_addr;

    int sin_size,portnumber;

    char hello[]="Hello! Are You Fine?\n";



    if((portnumber=atoi("155207"))<0)

    {

        fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);

        exit(1);

    }



    /* 服务器端开始建立socket描述符 */

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

        fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

        exit(1);

    }



    /* 服务器端填充 sockaddr结构  */

    bzero(&server_addr,sizeof(struct sockaddr_in));

    server_addr.sin_family=AF_INET;

    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

    server_addr.sin_port=htons(portnumber);



    /* 捆绑sockfd描述符  */

    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {

        fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

        exit(1);

    }



    /* 监听sockfd描述符  */

    if(listen(sockfd,5)==-1) {

        fprintf(stderr,"Listen error:%s\n\a",strerror(errno));

        exit(1);

    }



    while(1)

    {

        fprintf(stderr, "server is listening!\n");



        /* 服务器阻塞,直到客户程序建立连接  */

        sin_size=sizeof(struct sockaddr_in);

        if( ( new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),(socklen_t*)&sin_size ) ) == -1) {

            fprintf(stderr,"Accept error:%s\n\a",strerror(errno));

            exit(1);

        }



        fprintf(stderr,"Server get connection from %s\n",

            inet_ntoa(client_addr.sin_addr));

        if(write(new_fd,hello,strlen(hello))==-1) {

            fprintf(stderr,"Write Error:%s\n",strerror(errno));

实验2

实验二
使用多线程实现wc服务器并使用同步互斥机制保证计数正确
多线程就是一台服务器能够响应多台客户端的要求。

#include <stdlib.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include <unistd.h>

#include <netdb.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <arpa/inet.h>

#include <fcntl.h>



// 定义包的大小为512KB

#define PACK_SIZE 1024*512



int main(int argc, char *argv[])

{

    // 设置输出缓冲

    setvbuf(stdout, NULL, _IONBF, 0);

    fflush(stdout);



    int sockfd,new_fd;

    struct sockaddr_in server_addr;

    struct sockaddr_in client_addr;

    int sin_size,portnumber;

    char hello[]="Hello! Are You Fine?\n";



    if((portnumber=atoi("155207"))<0)

    {

        fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]);

        exit(1);

    }



    /* 服务器端开始建立socket描述符 */

    if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) {

        fprintf(stderr,"Socket error:%s\n\a",strerror(errno));

        exit(1);

    }



    /* 服务器端填充 sockaddr结构  */

    bzero(&server_addr,sizeof(struct sockaddr_in));

    server_addr.sin_family=AF_INET;

    server_addr.sin_addr.s_addr=htonl(INADDR_ANY);

    server_addr.sin_port=htons(portnumber);



    /* 捆绑sockfd描述符  */

    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) {

        fprintf(stderr,"Bind error:%s\n\a",strerror(errno));

        exit(1);

    }



    /* 监听sockfd描述符  */

    if(listen(sockfd,5)==-1) {

        fprintf(stderr,"Listen error:%s\n\a",strerror(errno));

        exit(1);

    }



    while(1)

    {

        fprintf(stderr, "server is listening!\n");



        /* 服务器阻塞,直到客户程序建立连接  */

        sin_size=sizeof(struct sockaddr_in);

        if( ( new_fd = accept(sockfd,(struct sockaddr *)(&client_addr),(socklen_t*)&sin_size ) ) == -1) {

            fprintf(stderr,"Accept error:%s\n\a",strerror(errno));

            exit(1);

        }



        fprintf(stderr,"Server get connection from %s\n",

            inet_ntoa(client_addr.sin_addr));

        if(write(new_fd,hello,strlen(hello))==-1) {

            fprintf(stderr,"Write Error:%s\n",strerror(errno));

posted on 2017-11-19 11:21  方片8  阅读(140)  评论(0编辑  收藏  举报