• 0
  • 0
分享

题目一

完成基于TCP的客户端和服务器程序编写,要求服务器采用循环方式处理客户端的数据。

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#define SERVER_PORT 5012
#define SERV_IP="127.0.0.1"
int main(void)
{
   int clientSocket = -1,listenSocket = -1;
   struct sockaddr_in cliaddr,seraddr;
   socklen_t clie_addr_len;
   char buf[BUFSIZ];
   int n,i,ret;
   listenSocket = socket(AF_INET,SOCK_STREAM,0);//用来指定套接字使用的地址格式,通常使用AF_INET IPV4
   //指定套接字的类型,若是SOCK_STREAM,则用的是tcp,指定使用的协议类型(当指定套接字类型后,可以设置为0,因为默认为UDP或TCP)
   if(-1 == listenSocket){
       perror("socket error");
       exit(1);
   }
   else
   {
       printf("listenSocket = %d\n",listenSocket);
    }
  // bzero(&seraddr,sizeof(seraddr));
   seraddr.sin_family = AF_INET;
   seraddr.sin_port = htons(SERVER_PORT);//1024 ~ 49151:普通用户注册的端口号
   seraddr.sin_addr.s_addr = htonl(INADDR_ANY);
   ret=bind(listenSocket,(struct sockaddr *)&seraddr,sizeof(seraddr));// 绑定这个套节字到一个本地地址
   if(ret == -1){
       perror("bind error");
       exit(1);
   }
   listen(listenSocket,128);// 进入监听模式,监听队列中允许保持的尚未处理的最大连接数
   if(ret == -1){
       perror("listen error");
       exit(1);
   }
   clie_addr_len = sizeof(cliaddr);
   clientSocket=accept(listenSocket,(struct sockaddr *)&cliaddr,&clie_addr_len);// 接受一个新连接,指向本地数据结构sockaddr_in的指针,
   //调用connect()的信息将存储在该结构中,返回一个socket 端口,用来通信
   if(clientSocket == -1){
       perror("accept error");
       exit(1);
   }
   while(1){
       n=read(clientSocket,buf,sizeof(buf));//收
       for(i=0;i<n;i++)
       buf[i]=toupper(buf[i]);
       write(clientSocket,buf,n);//发
    }
   close(clientSocket);// 关闭套节字
   close(listenSocket);
return 0;
}

client.c

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#define SERVER_PORT 5012
#define SERV_IP="127.0.0.1"
int main(void)
{
   int clientSocket = -1;
   struct sockaddr_in seraddr;
   socklen_t serv_addr_len;
   char buf[BUFSIZ];
   int n;
   clientSocket=socket(AF_INET,SOCK_STREAM,0);
   // 也可以在这里调用bind函数绑定一个本地地址, 否则系统将会自动安排
   bzero(&seraddr,sizeof(seraddr));
   seraddr.sin_family = AF_INET;
   seraddr.sin_port = htons(SERVER_PORT);// 注意,这里要填写服务器程序(TCPServer程序)所在机器的IP地址
   // 如果你的计算机没有联网,直接使用127.0.0.1即可
   seraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
   connect(clientSocket,(struct sockaddr *)&seraddr,sizeof(seraddr));
   while(1){
       fgets(buf,sizeof(buf),stdin);
       write(clientSocket,buf,strlen(buf));// 向服务器端发送数据
       n=read(clientSocket,buf,sizeof(buf));//从服务器端接收数据
       write(1,buf,n);
   }
   close(clientSocket);// 关闭套节字
return 0;
}
运行截图

1.png

题目二

完成基于UDP的客户端和服务器程序编写,要求服务器采用循环方式处理客户端的数据。

udpServer.c

#include<sys/types.h>
#include<sys/socket.h>  /*socket() bind()*/
#include<linux/in.h>  /*struct sockaddr_in*/
#include<string.h>   /*memset*/
#include<stdio.h>
#include<stdlib.h>
void udpserv_echo(int ,struct sockaddr*);
int main(int argc,char *argv[])
{
int s;
struct sockaddr_in addr_ser,addr_clie;
s = socket(AF_INET,SOCK_DGRAM,0);// 生成套接字文件描述符,用来指定套接字使用的地址格式,通常使用AF_INET IPV4
//指定套接字的类型,SOCK_STREAM数据报套接字,无连接,则用的是tcp,指定使用的协议类型(当指定套接字类型后,可以设置为0,因为默认为UDP或TCP);
memset(&addr_ser,0,sizeof(addr_ser));
// 通过struct sockaddr_in 结构设置服务器地址和监听端口
addr_ser.sin_family = AF_INET;
addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);//把unsigned long类型从主机序转换到网络序
addr_ser.sin_port = htons(8888);//把unsigned short类型从主机序转换到网络序
bind(s,(struct sockaddr*)&addr_ser,sizeof(addr_ser));
udpserv_echo(s,(struct sockaddr*)&addr_clie);
return 0;
}
void udpserv_echo(int s,struct sockaddr*addr_clie)
{
char buff[256];
int i=0;
int n;
char str[10];
socklen_t len;
while(1)
{
len = sizeof(*addr_clie);
sprintf(str,"%d",i);//把i转换为字符串
n=recvfrom(s,buff,256,0,addr_clie,&len);//收发数据,用函数send()和recv(),或者read()和write()
strcat(buff,str);//把收到的数据+i再发送到客户端
printf("%s,%s\n",str,buff);
sendto(s,buff,n+1,0,addr_clie,len);
i++;
}
}

udpClient.c

#include<sys/types.h>
#include<sys/socket.h>    /*socket() bind()*/
#include<linux/in.h>       /*struct sockaddr_in*/
#include<string.h>     /*memset()*/
#include<stdio.h>
void udpclie(int,struct sockaddr*);
int main(int argc,char *argv[])
{
int s;
struct sockaddr_in addr_ser;
s = socket(AF_INET,SOCK_DGRAM,0);//AF_INET IPV4协议,SOCK_DGRAM UDP协议
memset(&addr_ser,0,sizeof(addr_ser));//清空
addr_ser.sin_family = AF_INET;//IPV4
addr_ser.sin_addr.s_addr = htonl(INADDR_ANY);//将本地地址转换成无符号长整型的网络字节顺序。表示从本机的任一网卡接收数据
addr_ser.sin_port = htons(8888);//指定端口号把unsigned short类型从主机序转换到网络序
udpclie(s,(struct sockaddr*)&addr_ser);
close(s);
return 0;
}
void udpclie(int s,struct sockaddr*to)
{
char buff[256];// = "Hello udp";
struct sockaddr_in from;
socklen_t len = sizeof(*to);
while(1){
gets(buff);//puts(buff);
sendto(s,buff,256,0,to,len);//收发数据,用函数send()和recv(),或者read()和write()
recvfrom(s,buff,sizeof(buff),0,(struct sockaddr*)&from,&len);
printf("recved:%s\n",buff);
sleep(2);
}
}

2.jpg


作者:jiuqi_玖柒

原文链接:https://blog.csdn.net/qq_46036214/article/details/110501042#comments_14720027

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 一、前言在当前主流的前端后端分离模式开发下,拥有一个接口文档并且是好用的接口文档是很有必要的一个东西。PS:?以下观点是真实开发场景下碰到并且悟出来的痛点。1、在项目的开发过程中,有一个接口文档的存在能让前端后端工程师保持的数据信息概念是统一的。例如:”项目需求的接口字段,参数字段。所有只要请求的返回参数记录到文档中的情况后,前后端工程师编写代码的同时就能统一对照接口文档去编写各自的逻辑,那么在各个信息的命名都是统一的情况下,在各自的代码中就不会发生前端在一个需求功能的请求接口命名是与后端返回接口的命名信息不一致的情况。这样可以大大避免了导致排查问题的时候不能很快速的定位问题。2、好的接口文档...
            2 2 945
            分享
          •   近期身边有一些朋友陆续开始入行测试行业,在面试过程中随机场景用例设计基本是一个必问的问题,那这个是否也存在通用的回答模式呢?就让我们以最简单的移动端登录场景一起探寻一下吧。  测试用例设计的通用格式  其实软件测试用例设计也有一个大概的通用格式,任何场景拿到手后,都可以先按照功能、性能、安全、兼容性、发布等几个大维度大致拆分一下,然后再在每个维度中具体细分一一填充,最终整个用例设计就完成了。  按照这种分而治之的思路,用例设计是否比较简单呢?当然,在实际陈述过程中,建议按照同样的思路,这样可以给面试官一种条理清楚的感觉。  登录之功能设计  让我们从登录场景的功能维度入手吧。  常用功能 ...
            0 0 121
            分享
          • web页面问题定位:第一步:前后端判断先判断是前端还是后端的问题,如果是接口请求响应数据是正常的,则进一步定位前端问题。前端问题可以通过F12打开调试模式,切换到source 页面进行查看是否是js文件内的语法错误,或者是资源文件位置未找到等问题第二部:后端具体原因分析后端接口请求异常,则可通过状态码进行判断400--请求语法错误,也就是前后端语法定义不一致401--未授权403--服务端拒绝访问404--资源不存在500--服务器内部错误如果遇到磁盘满了,就需要看应用程序是否活着,如果活着则返回500(服务器处理异常),若是应用程序已经死了,则返回400资源不存在了app端和服务端问题定位:...
            0 0 2524
            分享
          • 事情是这样的,女朋友昨天跟我吐槽说她闺蜜玩“羊了个羊” 刷到朋友圈榜前10,而她连第二关都过不了,已经开始怀疑自己了。于是我拿起了她的手机打开了羊了个羊小程序,打开了Charles和Apifox,并且结合了Apifox的自动化测试功能不小心把她刷到榜一!准备工作抓包工具:Charles 获取token接口管理工具:Apifox 地址:apifox.cnCharles 抓包1.获取PC的IP地址2.配置代理这里以iPhone手机为例:在iPhone的设置 -> 无线局域网 -> 局域网信息 -> 配置代理 -> 手动中配置代理,服务器输入框中填写PC的IP地址,端口输入框...
            0 0 2805
            分享
          •   情景说明  小Q是一名工作多年的测试开发工程师,优势是技术能力强,善于通过技术解决工作中的问题,待改进项是思想站位需要提升,做事推动力需要加强。  辅导过程  小Z:工作中对你的建设性反馈中有一项是需要提升思想站位,今天来聊聊。  小Q:好,但我想问下,到底什么叫提高思想站位,具体表现是什么?高和低的区别是怎样的?  小Z:好问题。官方的解释你可以查查资料,我用工作中一个例子阐述一下。  以自动化测试这个事项为例,作为主R(专项负责人),大体上可以有三个维度,一是看问题的视角,二是时效性,三是对资源的撬动。  1.看问题的视角:你思考问题的视角要能够站在更大的范围,同样是自动化测试专项,你...
            0 0 488
            分享
      • 51testing软件测试圈微信