实验平台

linux

实验内容

编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接。一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串

实验原理

TCP是面向连接的通信,其主要实现过程如下:

我们将服务器代码分为两部分。

1. init_tcp_server() tcp服务器的初始化

2. main() 实现读写数据

这样做的好处是main函数不必写的特别冗长,利于维护。从框架上来说,服务器的初始化也与读、写无关。

tcp服务器的初始化----init_tcp_server()

1. 创建socket

sockfd = socket(AF_INET, SOCK_STREAM, 0); //AF_INT:ipv4, SOCK_STREAM:tcp协议

2. 设置socket  当然这一步可以省略

int32_t opt = 1;

ret= setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

详细说明:

3. 绑定(bind函数)

将socket和地址(包括ip,port)绑定。需要定义一个结构体地址,以便于将port的主机字节序转化成网络字节序

struct sockaddr_in serveraddr; //地址结构体

bind函数

bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))

4. listen监听,将接收到的客户端放入队列

listen(sockfd,10) //第二个参数是队列长度

5. 调用accept函数,从队列获取请求,返回socket描述符,如果没有请求(没有客户端连接),将会阻塞,直到获取请求

int fd=accept(sockfd, (struct sockaddr*)&clientaddr, &clientaddr_len);

至此服务器初始化完成,返回成功连接的套接字fd。

服务器端代码如下:tcpserver.c

#include #include#include#include#include#include#include#include

#define PORT 1234

#define BACKLOG 10

#define BUFFER_SIZE 100

/**

* @brief 初始化tcp服务器

* @param[in] listenfd 监听套接字

* @return -1 - 失败, socket 文件句柄 - 成功*/int32_t init_tcp_server(int32_t listenfd)

{structsockaddr_in server;structsockaddr_in client;

int32_t connectfd= 0;

int32_t addrlen;

int32_t ret= 0;

addrlen= sizeof(client);/**< 创建一个tcp套接字*/listenfd= socket(AF_INET, SOCK_STREAM, 0);if (listenfd == -1)

{

perror("create socket failed!\n");

exit(1);

}/**< 设置一个tcp套接字*/int32_t opt= 1;

ret= setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if (ret < 0)

{

perror("set socket failed!\n");

exit(1);

}/**< 设置服务器监听所有的IP地址*/bzero(&server, sizeof(structsockaddr_in));

server.sin_family=AF_INET;

server.sin_port= htons(PORT); /**< 主机字节序转化成网络字节序*/server.sin_addr.s_addr=htonl(INADDR_ANY);/**< 与服务器进行绑定*/

if (bind(listenfd, (struct sockaddr *)&server, sizeof(server)) == -1)

{

perror("bind error");

exit(1);

}/**< 监听*/

if (listen(listenfd, BACKLOG) == -1)

{

perror("listen error");

exit(1);

}/**< 等待客户端连接,如果没有,一直阻塞*/

if ((connectfd = accept(listenfd, (struct sockaddr *)&client, &addrlen)) == -1)

{

perror("accept error");

close(listenfd);

close(connectfd);

exit(1);

}

printf("You got a connection from client's ip is %s, port is %d\n", inet_ntoa(client.sin_addr), htons(client.sin_port));returnconnectfd;

}intmain()

{

int32_t listenfd= 0;

int32_t connectfd= 0;char buf[BUFFER_SIZE] = "Welcome to my server";

connectfd=init_tcp_server(listenfd);

send(connectfd, buf, BUFFER_SIZE,0); /**< 发送信息到客户端*/close(connectfd);

close(listenfd);

}

客户端

同样,将客户端代码分成两部分:

1. init_tcp_client() tcp客户端的初始化

2. main() 实现读写数据

客户端的初始化较为简单,如上图,只要实现socket和connect函数即可。但是我们希望可以手动输入客户端连接的IP地址,便于以后扩展,因此需要给客户端初始化传入一个参数。例如,输入:

./tcpclient 127.0.0.1

客户端代码如下:tcpclient.c

#include #include#include#include#include#include#include#include

#define PORT 1234

#define BUFFER_SIZE 100int32_t init_tcp_client(char *ipaddr)

{int sockfd = 0;structsockaddr_in server;if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

perror("create socket failed!\n");

exit(1);

}

bzero(&server, sizeof(structsockaddr_in));

server.sin_family=AF_INET;

server.sin_port=htons(PORT);

inet_pton(AF_INET, ipaddr,&server.sin_addr.s_addr); /**< 点分十进制转换成二进制的网络字节序*/

if (connect(sockfd, (struct sockaddr *)&server, sizeof(server)) == -1)

{

perror("connect error");

exit(1);

}returnsockfd;

}

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

{

int32_t sockfd, num;charbuf[BUFFER_SIZE];if (argc != 2)

{

printf("Usage:%s \n",argv[0]);

exit(1);

}

sockfd= init_tcp_client(argv[1]);if ((num = recv(sockfd, buf, BUFFER_SIZE, 0)) == -1)

{

perror("recv error");

exit(1);

}

buf[num- 1] = '\0';

printf("Server Message: %s\n", buf);

close(sockfd);return 0;

}

Makefile文件如下:

all:server client

server:tcpserver.c

gcc tcpserver.c-o server

client:tcpclient.c

gcc tcpclient.c-o client

clean:

rm-rf server client

实验结果如下:

墨麟科技Java服务器_基于TCP的客户端和服务器端的代码设计相关推荐

  1. c udp文件发送到服务器端,基于UDP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写UDP服务器和客户端程序,客户端发送消息,服务器接收消息,并打印客户端的IP地址和端口号. 实验原理 UDP是无需连接的通信,其主要实现过程如下: 同样,我们可以按 ...

  2. Java毕业设计_基于javaweb的网上预约实验室管理系统的设计与实现

    基于javaweb的网上预约实验室管理系统的设计与实现 基于javaweb的网上预约实验室管理系统的设计与实现mysql数据库创建语句 基于javaweb的网上预约实验室管理系统的设计与实现oracl ...

  3. Java毕业设计_基于SSM框架的图片素材管理系统的设计与实现

    基于SSM框架的图片素材管理系统的设计与实现 基于SSM框架的图片素材管理系统的设计与实现mysql数据库创建语句 基于SSM框架的图片素材管理系统的设计与实现oracle数据库创建语句 基于SSM框 ...

  4. Java毕业设计_基于SSM的美食食谱分享网站的设计与实现

    基于SSM的美食食谱分享网站的设计与实现 基于SSM的美食食谱分享网站的设计与实现mysql数据库创建语句 基于SSM的美食食谱分享网站的设计与实现oracle数据库创建语句 基于SSM的美食食谱分享 ...

  5. Java毕业设计_基于WEB的多媒体素材管理库的设计与开发

    基于WEB的多媒体素材管理库的设计与开发 基于WEB的多媒体素材管理库的设计与开发mysql数据库创建语句 基于WEB的多媒体素材管理库的设计与开发oracle数据库创建语句 基于WEB的多媒体素材管 ...

  6. java毕业设计_基于J2EE的小学生老师家长互动平台设计与实现

    基于J2EE的小学生老师家长互动平台设计与实现 基于J2EE的小学生老师家长互动平台设计与实现mysql数据库创建语句 基于J2EE的小学生老师家长互动平台设计与实现oracle数据库创建语句 基于J ...

  7. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  8. Java学习系列(十六)Java面向对象之基于TCP协议的网络通信

    TCP/IP的网络分层模型:应用层(HTTP/FTP/SMTP/POPS...),传输层(TCP协议),网络层(IP协议,负责为网络上节点分配唯一标识),物理层+数据链路层). IP地址用于标识网络中 ...

  9. Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图

    Java服务器部署基于OpenCV的C++图像处理项目(三)图片上传并返回处理图 1.上传图片并返回灰度图功能 由于使用的springboot开发,直接写一个upload接口供图片上传,以下是spri ...

最新文章

  1. oracle视图(转)
  2. excel的if函数中android,excel中if函数嵌套式使用教程
  3. SAP RETAIL WA01 创建分配表报错 - Plant 0000000039 Confirmation date not maintained.-
  4. CUDA error: an illegal memory access was encountered
  5. 【Matlab】绘制不同颜色线条
  6. oracle Hint 使用
  7. 如何新建java内部类_java内部类-1(内部类的定义)
  8. C#后台调用前台js(RegisterStartupScript)
  9. 编程之美-程序理解和时间分析
  10. mysql-------视图
  11. linux怎么db2命令窗口,Linux 命令行进入DB2
  12. :layout_gravity gravity
  13. Rusr Error: linker `x86_64-w64-mingw32-gcc` not found
  14. 使用Spring Boot开发财务系统视频
  15. python画超长图-python实现按长宽比缩放图片
  16. 计算机蓝屏显示的英文是什么,电脑蓝屏出现一堆英文怎么解决?
  17. 副屏幕全屏_win7双屏电脑主屏副屏设置|Win7系统如何设置双屏显示?
  18. [题解][CF-1292C]Xenon‘s Attack on the Gangs
  19. 干货教程:如何把一张照片用PS做成漫画风格(附最新视频教程)
  20. 关于c基础实现简易计算器的代码(加减乘除)

热门文章

  1. 15、Java——迷你图书管理器(变量+数组)
  2. 三个相同的字组成重字读法
  3. 比较经典的爱情笑话5则
  4. 学习摄影,需要了解哪些知识? | 拍者手记
  5. 戴口罩解锁 iPhone?这样做分分钟搞定
  6. 幽默搞笑短信-(很雷人的短信笑话)
  7. 有史以来最受推崇的编程书有哪些?相信你看过后一定会大呼过瘾!
  8. 免费NETC#开发参考资料合辑
  9. 【爬虫实战】评论爬取及词频统计详解
  10. 我是机器人布里茨_蒸汽机器人布里茨辅助玩法!