首页 > 编程语言 >实验四 Web服务器1-socket编程

实验四 Web服务器1-socket编程

时间:2022-12-01 17:57:50浏览次数:44  
标签:Web MAXBUF socket int 编程 sock 服务器 include addr

任务详情

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

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

查看系统ip

time服务器的客户端服务器,提交程序运行截图

timeserver.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
 
#define MAXBUF 1000
#define PORT 1203

int main(int argc, char const *argv[])
{
 int sock = 0;
 int n = 0;
 int reuse = 1;
 int cli_len = sizeof(struct sockaddr);
 char strbuf[MAXBUF] = {0};
 struct sockaddr_in addr, cli;
 
  
 bzero(&addr, sizeof(addr));
 addr.sin_family = PF_INET;
 addr.sin_addr.s_addr = INADDR_ANY;
 addr.sin_port = htons(PORT);
 
  
 sock = socket(AF_INET, SOCK_DGRAM, 0);
 if (sock < 0)
 {
  perror("socket");
  return -1;
 }
 
 
 setsockopt(sock , SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
 
 
 if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
 {
  perror("bind");
  return -1;
 }
 
 while(1){
  memset(strbuf, 0, MAXBUF);
  
  
  n = recvfrom(sock, strbuf, MAXBUF, 0, (struct sockaddr *)&cli, &cli_len);
  if(n<0){
   perror("recvfrom");
   return -1;
  }else{
   printf("pid is %d\n",getpid()); //process pid
   printf(" time is %s\n", strbuf);
  }
 }
 
 return 0;
}

timeclient.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXBUF 1000
#define PORT 1203

int main(int argc, char const *argv[])
{
 int sock = 0;
 int n = 0;
 int reuse = 1;
 struct sockaddr_in srvsock;
 char timebuf[MAXBUF] = {0};


 if (argc != 2)
 {
  printf("Usage:%s ServerIP\n", argv[0]);
  return -1;
 }

 
 bzero(&srvsock, sizeof(srvsock));
 srvsock.sin_family = PF_INET;
 srvsock.sin_addr.s_addr = inet_addr(argv[1]);
 srvsock.sin_port = htons(PORT);
 sock = socket(AF_INET, SOCK_DGRAM, 0);

 if(sock<0){
  perror("socket");
  return -1;
 }
 

 while(1){
  sleep(1);
  time_t t=time(NULL);
  strcpy(timebuf,ctime(&t));

   
  if ((n = sendto(sock, timebuf, strlen(timebuf), 0, (struct sockaddr *) &srvsock, sizeof(struct sockaddr))) < 0)
  {
   perror("sendto");
   return -1;
  }else{
   printf("time is %s\n", timebuf);
  }
 }
}

运行截图

echo服务器的客户端服务器,提交程序运行截图,服务器把客户端传进来的内容加入“服务器进程pid 你的学号 姓名 echo :”返回给客户端

echoserver.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXBUF 1000
#define PORT 1203

int main(int argc, char const *argv[])
{
 int sock = 0;
 int n = 0;
 int reuse = 1;
 int cli_len = sizeof(struct sockaddr);
 char strbuf[MAXBUF] = {0};
 struct sockaddr_in addr, cli;
 
  
 bzero(&addr, sizeof(addr));
 addr.sin_family = PF_INET;
 addr.sin_addr.s_addr = INADDR_ANY;
 addr.sin_port = htons(PORT);
 
 
 sock = socket(AF_INET, SOCK_DGRAM, 0);
 if (sock < 0)
 {
  perror("socket");
  return -1;
 }
 
  
 setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
 
  
 if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
 {
  perror("bind");
  return -1;
 }
 
 while(1){
  memset(strbuf, 0, MAXBUF);
   
  n = recvfrom(sock, strbuf, MAXBUF, 0, (struct sockaddr *)&cli, &cli_len);
  if(n<0){
   perror("recvfrom");
   return -1;
  }else{
   printf("pid:%d \n echo:\n",getpid());
   printf("收到来自%s(端口%d)的消息: %s\n",inet_ntoa(cli.sin_addr), PORT, strbuf);
  }
 }
 
 return 0;
}

echoclient.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXBUF 1000
#define PORT 1203

int main(int argc, char const *argv[])
{
 int sock = 0;
 int n = 0;
 int reuse = 1;
 struct sockaddr_in srvsock;
 char strbuf[MAXBUF] = {0};
 
 if (argc != 2)
 {
  printf("Usage:%s ServerIP\n", argv[0]);
  return -1;
 }
 
 bzero(&srvsock, sizeof(srvsock));
 srvsock.sin_family = PF_INET;
 srvsock.sin_addr.s_addr = inet_addr(argv[1]);
 srvsock.sin_port = htons(PORT);
 
 sock = socket(AF_INET, SOCK_DGRAM, 0);
 if(sock<0){
  perror("socket");
  return -1;
 }
 
 while(1){
  memset(strbuf, 0, MAXBUF);
 
  fgets(strbuf, MAXBUF, stdin);
 
 
  if ((n = sendto(sock, strbuf, strlen(strbuf), 0, (struct sockaddr *) &srvsock, sizeof(struct sockaddr))) < 0)
  {
   perror("sendto");
   return -1;
  }else{
   printf("send to %s(port=%d) len %d:%s\n", argv[1], PORT, n, strbuf);
  }
 }
}

运行截图

要用多线程或者多进程实现,至少连接两个客户端。

实验截图

标签:Web,MAXBUF,socket,int,编程,sock,服务器,include,addr
From: https://www.cnblogs.com/1314liyang/p/16942193.html

相关文章

  • web服务器2
    编译查看ip地址访问服务器部署到华为云服务器,浏览器用本机的服务器部署访问......
  • Web服务器2
    ......
  • WEB-RTC 基础概念和架构
    参考文章:WebRTC简介;从0搭建一个WebRTC,实现多房间多对多通话,并实现屏幕录制;架构:经典三层结构:Webapp层(应用层):Web开发者开发的程序,Web开发者可以基于集成Web......
  • C++编程技巧: Pimpl
    Pimpl(Pointertoimplementation)是一种减少代码依赖和编译时间的C++编程技巧,其基本思想是将一个外部可见类(visibleclass)的实现细节(一般是所有私有的非虚成员)放在一个......
  • UIControl IOS控件编程—IOS开发
    UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、UIPageControl分页控件。控件是对UIView派生类的......
  • sdwebimage的使用
    WebImageThislibraryprovidesacategoryforUIImageVIewwithsupportforremoteimagescomingfromtheweb.Itprovides:AnUIImageViewcategoryaddingwebimag......
  • Python实验报告——第13章 Pygame游戏编程
    实验报告【实验目的】 1.掌握Pygame的基础知识。【实验条件】1.PC机或者远程编程环境。 【实验内容】1.完成第十三章  实例01:篮球自动弹跳。  实例01:创......
  • Scratch 01:少儿编程简介
    时至今日,在全国大城市中,少儿编程已经非常的火热了,它的流行跟当前社会的发展有大大的关系。智能化、智慧化已快速进入了我们的生活。现在的文盲和以前的定义又有了大不同了。......
  • Learn by testing: Unix socket 如何通信?
    本文参考communicatewithunixsockets做了一些简单的测试,了解unixsocket是如何通信的。创建一个tcpsocket创建一个unixsocket,命令不会返回,会一直等待:#nc-U/tmp......
  • webstorm PluginManagerCore$Essential Plugin Missing Exception Missing essential
    环境说明操作系统:macOSVentura13.0.1软件版本:WebStorm2022.3背景今天CLion自动更新到2022.3版本后,发现Webstorm会自动同步CLion安装的插件,然后我一顿折腾后......