任务详情

基于华为鲲鹏云服务器CentOS中(或Ubuntu),使用Linux Socket实现:

  1. time服务器的客户端服务器,提交程序运行截图
  2. echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid 你的学号 姓名 echo :”返回给客户端
  3. 服务器部署到华为云服务器,客户端用Ubuntu虚拟机。
  4. 要用多线程或者多进程实现,至少连接两个客户端。
  5. 把服务器部署到试验箱。(加分项)

time服务器的客户端服务器

截图



代码

//csapp.c
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h> #define MAXLINE 100
typedef struct sockaddr SA;
#define LISTENQ 1024
#define EINTR 4
#define RIO_BUFSIZE 8192 typedef struct{ int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE];
}rio_t; int open_listenfd(int port){ int listenfd,optval=1;
struct sockaddr_in serveraddr; if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0)
return -1; if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,
(const void*)&optval,sizeof(int))<0)
return -1; bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)port);
if(bind(listenfd,(SA*)&serveraddr,sizeof(serveraddr))<0)
return -1; if(listen(listenfd,LISTENQ)<0)
return -1; return listenfd;
} int open_clientfd(char *hostname,int port){ int clientfd;
struct hostent *hp;
struct sockaddr_in serveraddr; if((clientfd = socket(AF_INET,SOCK_STREAM,0))<0)
return -1; if((hp = gethostbyname(hostname))==NULL)
return -2; bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)hp->h_addr_list[0],
(char *)&serveraddr.sin_addr.s_addr,hp->h_length);
serveraddr.sin_port = htons(port); if(connect(clientfd,(SA *)&serveraddr,sizeof(serveraddr))<0)
return -1; return clientfd;
} ssize_t rio_writen(int fd, void *usrbuf,size_t n){ size_t nleft = n;
ssize_t nwritten;
char *bufp = usrbuf; while(nleft>0){ if((nwritten = write(fd,bufp,nleft))<=0){ if((nwritten = write(fd,bufp,nleft))<=0){ if(errno == EINTR)
nwritten = 0;
else
return -1;
}
nleft -= nwritten;
bufp += nwritten;
}
}
return n;
} void rio_readinitb(rio_t *rp,int fd){ rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
} ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n){ int cnt; while(rp->rio_cnt <=0){ rp->rio_cnt = read(rp->rio_fd,rp->rio_buf,sizeof(rp->rio_buf)); if(rp->rio_cnt<0){ if(errno!=EINTR)
return -1;
}
else if(rp->rio_cnt==0)
return 0;
else
rp->rio_bufptr = rp->rio_buf;
} cnt = n;
if(rp->rio_cnt < n)
cnt = rp->rio_cnt;
memcpy(usrbuf,rp->rio_bufptr,cnt);
rp->rio_bufptr += cnt;
rp->rio_cnt -= cnt;
return cnt;
} ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen){ int n,rc;
char c,*bufp = usrbuf; for(n=1;n<maxlen;n++){ if((rc = rio_read(rp,&c,1))==1){ *bufp++ = c;
if(c=='\n')
break;
}else if(rc==0){ if(n==1)
return 0;
else
break;
}else
return -1;
} *bufp = 0;
return n;
} void echo(int connfd){ size_t n;
char buf[MAXLINE];
rio_t rio; rio_readinitb(&rio,connfd);
while((n = rio_readlineb(&rio,buf,MAXLINE))!=0){ printf("server received %d bytes\n",n); rio_writen(connfd,buf,n);
}
}
//dateclient.c
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h> #define RIO_BUFSIZE 8192 typedef struct{
int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE]; }rio_t; #define MAXLINE 200 int main(int argc,char **argv){ int clientfd,port;
char *host,buf[MAXLINE];
char sbuf[MAXLINE];
char rbuf[MAXLINE];
rio_t rio;
char str1[MAXLINE]="客户端IP:";
char str2[MAXLINE]="服务器实现者学号:20201209"; char str3[MAXLINE]="当地时间:"; if(argc!=3){ fprintf(stderr,"usage:%s <host> <port>\n",argv[0]);
exit(0);
}
host = argv[1];
port = atoi(argv[2]); clientfd = open_clientfd(host,port); while(1){ recv(clientfd,rbuf,MAXLINE,0); printf("%s",str1);
puts(host); printf("%s",str2);
putchar('\n'); printf("%s",str3); puts(rbuf); close(clientfd); exit(0);
} }
//dateserver.c
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <time.h>
#include <string.h> #define MAXLINE 200
#define RIO_BUFSIZE 8192 typedef struct{
int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE]; }rio_t; typedef struct sockaddr SA; typedef struct{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}tm; void sigchld_handler(int sig){ pid_t pid;
int stat; while((pid = waitpid(-1,&stat,WNOHANG))>0){
printf("child %d terminated\n",pid);
}
return;
} int main(int argc,char **argv){ int listenfd,connfd,port,clientlen;
struct sockaddr_in clientaddr;
struct hostent *hp;
char *haddrp;
char sbuf[MAXLINE];
char rbuf[MAXLINE];
rio_t rio;
time_t lt;
tm *local;
char str1[MAXLINE]="客户端IP:";
char str2[MAXLINE]="服务器实现者学号:";
char str3[MAXLINE]="当地时间:"; if(argc != 2){ fprintf(stderr,"usage:%s <port>\n",argv[0]);
exit(0);
}
port = atoi(argv[1]);
signal(SIGCHLD,sigchld_handler);
listenfd = open_listenfd(port);
while(1){ clientlen = sizeof(clientaddr);
connfd = accept(listenfd,(SA *)&clientaddr,&clientlen);
hp = gethostbyaddr((const char*)&clientaddr.sin_addr.s_addr,
sizeof(clientaddr.sin_addr.s_addr),AF_INET);
haddrp = inet_ntoa(clientaddr.sin_addr);
printf("server connected to %s (%s)\n",hp->h_name,haddrp);
if(fork() == 0){
close(listenfd);
lt = time(NULL);
local = localtime(&lt);
strftime(sbuf,64,"%Y-%m-%d %H:%M:%S",local);
send(connfd,sbuf,MAXLINE,0);
close(connfd);
exit(0);
}
close(connfd);
}
}

echo服务器的客户端服务器

截图





代码

//csapp.c
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdio.h> #define MAXLINE 100
typedef struct sockaddr SA;
#define LISTENQ 1024
#define EINTR 4
#define RIO_BUFSIZE 8192 typedef struct{ int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE];
}rio_t; int open_listenfd(int port){ int listenfd,optval=1;
struct sockaddr_in serveraddr; if((listenfd = socket(AF_INET,SOCK_STREAM,0))<0)
return -1; if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,
(const void*)&optval,sizeof(int))<0)
return -1; bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons((unsigned short)port);
if(bind(listenfd,(SA*)&serveraddr,sizeof(serveraddr))<0)
return -1; if(listen(listenfd,LISTENQ)<0)
return -1; return listenfd;
} int open_clientfd(char *hostname,int port){ int clientfd;
struct hostent *hp;
struct sockaddr_in serveraddr; if((clientfd = socket(AF_INET,SOCK_STREAM,0))<0)
return -1; if((hp = gethostbyname(hostname))==NULL)
return -2; bzero((char *)&serveraddr,sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)hp->h_addr_list[0],
(char *)&serveraddr.sin_addr.s_addr,hp->h_length);
serveraddr.sin_port = htons(port); if(connect(clientfd,(SA *)&serveraddr,sizeof(serveraddr))<0)
return -1; return clientfd;
} ssize_t rio_writen(int fd, void *usrbuf,size_t n){ size_t nleft = n;
ssize_t nwritten;
char *bufp = usrbuf; while(nleft>0){ if((nwritten = write(fd,bufp,nleft))<=0){ if((nwritten = write(fd,bufp,nleft))<=0){ if(errno == EINTR)
nwritten = 0;
else
return -1;
}
nleft -= nwritten;
bufp += nwritten;
}
}
return n;
} void rio_readinitb(rio_t *rp,int fd){ rp->rio_fd = fd;
rp->rio_cnt = 0;
rp->rio_bufptr = rp->rio_buf;
} ssize_t rio_read(rio_t *rp,char *usrbuf,size_t n){ int cnt; while(rp->rio_cnt <=0){ rp->rio_cnt = read(rp->rio_fd,rp->rio_buf,sizeof(rp->rio_buf)); if(rp->rio_cnt<0){ if(errno!=EINTR)
return -1;
}
else if(rp->rio_cnt==0)
return 0;
else
rp->rio_bufptr = rp->rio_buf;
} cnt = n;
if(rp->rio_cnt < n)
cnt = rp->rio_cnt;
memcpy(usrbuf,rp->rio_bufptr,cnt);
rp->rio_bufptr += cnt;
rp->rio_cnt -= cnt;
return cnt;
} ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen){ int n,rc;
char c,*bufp = usrbuf; for(n=1;n<maxlen;n++){ if((rc = rio_read(rp,&c,1))==1){ *bufp++ = c;
if(c=='\n')
break;
}else if(rc==0){ if(n==1)
return 0;
else
break;
}else
return -1;
} *bufp = 0;
return n;
} void echo(int connfd){ size_t n;
char buf[MAXLINE];
rio_t rio; rio_readinitb(&rio,connfd);
while((n = rio_readlineb(&rio,buf,MAXLINE))!=0){ printf("server received %d bytes\n",n); rio_writen(connfd,buf,n);
}
}
//echoclient.c
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <string.h> #define RIO_BUFSIZE 8192 typedef struct{
int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE]; }rio_t; #define MAXLINE 200 int main(int argc,char **argv){ int clientfd,port;
char *host,buf[MAXLINE];
char sbuf[MAXLINE];
char rbuf[MAXLINE];
rio_t rio;
char str1[MAXLINE]="服务器进程pid:";
char str2[MAXLINE]="服务器实现者学号姓名:20201209 戴骏"; char str3[MAXLINE]="echo:"; if(argc!=3){ fprintf(stderr,"usage:%s <host> <port>\n",argv[0]);
exit(0);
}
host = argv[1];
port = atoi(argv[2]); clientfd = open_clientfd(host,port); while(1){
scanf("%[^\n]",sbuf);
send(clientfd,sbuf,MAXLINE,0); recv(clientfd,rbuf,MAXLINE,0); printf("%s",str1);
printf("%d\n",getpid()); printf("%s",str2);
putchar('\n'); printf("%s",str3); puts(rbuf); close(clientfd); exit(0);
} }
//echoserver.c
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <pthread.h> #define MAXLINE 200
#define RIO_BUFSIZE 8192 typedef struct{
int rio_fd;
int rio_cnt;
char *rio_bufptr;
char rio_buf[RIO_BUFSIZE]; }rio_t; typedef struct sockaddr SA; typedef struct{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}tm; void *thread(void *vargp); int main(int argc,char **argv){ int listenfd,*connfdp,port;
int clientlen;
struct sockaddr_in clientaddr;
struct hostent *hp;
char *haddrp;
pthread_t tid; if(argc != 2){ fprintf(stderr,"usage:%s <port>\n",argv[0]);
exit(0);
} port = atoi(argv[1]); listenfd = open_listenfd(port); while(1){ clientlen = sizeof(clientaddr); connfdp =malloc(sizeof(int)); *connfdp = accept(listenfd,(SA *)&clientaddr,&clientlen); hp = gethostbyaddr((const char*)&clientaddr.sin_addr.s_addr,
sizeof(clientaddr.sin_addr.s_addr),AF_INET); haddrp = inet_ntoa(clientaddr.sin_addr); printf("server connected to %s (%s)\n",hp->h_name,haddrp); pthread_create(&tid,NULL,thread,connfdp); pthread_join(tid,NULL);
}
} void *thread(void *vargp){ time_t lt;
tm *local;
char sbuf[MAXLINE];
char rbuf[MAXLINE];
int connfd = *((int*)vargp); free(vargp); pthread_detach(pthread_self()); recv(connfd,rbuf,MAXLINE,0);
printf("The massage is :%s\n",rbuf);
send(connfd,rbuf,MAXLINE,0); close(connfd); return NULL;
}

服务器部署到华为云服务器,客户端用Ubuntu虚拟机。

截图

用多线程或者多进程实现

截图



Web服务器1-socket编程的更多相关文章

  1. 基于C语言的Socket网络编程搭建简易的Web服务器(socket实现的内部原理)

    首先编写我们服务器上需要的c文件WebServer.c 涉及到的函数API: int copy(FILE *read_f, FILE * write_f) ----- 文件内容复制的方法 int Do ...

  2. python web编程-CGI帮助web服务器处理客户端编程

    这几篇博客均来自python核心编程 如果你有任何疑问,欢迎联系我或者仔细查看这本书的地20章 另外推荐下这本书,希望对学习python的同学有所帮助 概念预热 eb客户端通过url请求web服务器里 ...

  3. JSP之WEB服务器:Apache与Tomcat的区别 ,几种常见的web/应用服务器

    注意:此为2009年的blog,注意时效性(针对常见服务器)     APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等 ...

  4. 主流Web服务器一览

    概念Web服务器是可以向发出请求的浏览器提供文档的程序. 1.服务器是一种被动程序:只有当Internet上运行在其他计算机中的浏览器发出请求时,服务器才会响应. 2.最常用的Web服务器是Apach ...

  5. 什么是WEB服务器?

    简单的理解:  一个公用的服务器,你可以放置网站文件,让全世界浏览,可以放文件,全世界下载.web服务器一般指网站服务器.  web服务器是基于网站架设的服务器,我们平时可以浏览的网页都是在别人的服务 ...

  6. web服务器和应用服务器概念比较

    转自:http://hi.baidu.com/lclkathy/blog/item/dae3be36763a47370b55a970.html 一 常见的WEB服务器和应用服务器 在UNIX和LINU ...

  7. [转]浏览器如何和Web服务器通信

    http://hi.baidu.com/ywqme/item/b5297014b2e58f4e6826bb74 概述 普通网民打开网页,访问网站,并不需要了解所谓HTTP协议.作为软件工程师,了解一下 ...

  8. 几种常见的Web服务器

    Apache与Tomcat的区别 ,几种常见的web/应用服务器 APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等动态 ...

  9. Web服务器学习总结(一):web服务器简介

    一.WEB服务器 1.1.WEB服务器简介 1.Web服务器是指驻留于因特网上某种类型计算机的程序,是可以向发出请求的浏览器提供文档的程序.当Web浏览器(客户端)连到服务器上并请求文件时,服务器将处 ...

  10. javaweb入门---web服务器与HTTP协议基础

    上文web基础简介了web到底是什么,以及身为Java开发人员需要掌握的地方.本文将解答web服务器是什么,怎么使用?还有关于http协议的基础知识. web服务器 web服务器的大概念很广泛,但是通 ...

随机推荐

  1. 【项目实战】从零到一搭建Spring Boot整合Mybatis-plus

    前言 2023年想搭建一套属于自己的框架,做一个属于自己想法的项目.这些年工作中一直用公司已有的框架,以前有跟着学习视频搭建过,但自己真正动手搭建时发现问题还是很多,比如没有引入Mybatis-plu ...

  2. 经典问题 1 —— DAG 上区间限制拓扑序

    问题描述 给定一个 DAG,求一个拓扑序,使得节点 \(i\) 的拓扑序 \(\in [l_i,r_i]\). 题解 首先进行一个预处理:对于所有 \(u\),令 \(\forall (v,u)\in ...

  3. WPF-3D图形

    WPF-3D图形 WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染.本文主要讲述了WPF-3D中的关键概念, 以及常用到的命中测试.2d控件如何在3D ...

  4. U3D编辑器开发&粒子特效/动画预览器示例

    概述 U3D提供了一套拓展编辑器的接口,可以用于直接在编辑器非播放模式运行程序.常用于运行一些工具程序,例如资源管理.在做技能编辑器等工具程序时,也可以使用运行模式接口会比较简单(这样也方便开放游戏创 ...

  5. 为什么 Go 不支持 []T 转换为 []interface

    在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换. 举个例子: package main import "fmt" func ...

  6. Kubernetes(k8s)配置文件管理:ConfigMap

    目录 一.系统环境 二.前言 三.ConfigMap概览 四.创建ConfigMap 五.ConfigMap的使用 5.1 以环境变量的方式使用ConfigMap 5.2 以卷的方式使用ConfigM ...

  7. 【分析笔记】Linux 内核自旋锁的理解和使用原则

    自旋锁简单说明: 自旋锁主要解决在竞态并发下,保护执行时间很短的临界区.它只允许一个执行单位进入临界区,在该执行单位离开前,其它的执行单位将会在进入临界区前不停的循环等待(即所谓的自旋),直至该执行单 ...

  8. openstacksdk快速上手

    hello,大家好,这里是费冰,今天是大年初六,唉,这么早就被迫营业了. 那么今天来解读一波openstacksdk. Openstacksdk是什么 其实我很难说明一个是什么的问题.如果你使用过py ...

  9. JavaScript 函数所能传递的最大参数

    取决于实现,取决于浏览器和操作系统标准没有规定(65535一般是有的) 来源:https://stackoverflow.com/questions/22747068/is-there-a-max-n ...

  10. Eclpis-cannot open git-receive-pack

    转载:https://blog.csdn.net/qq_29954971/article/details/80191193 问题:在采用MyEclipse软件(JDK1.7)作为开发环境,利用GitH ...