一.实验目的

理解tcp传输客户端服务器端通信流程

二.实验平台

MAC OS

三.实验内容

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

四.实验原理

使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通信,它分为服务器端和客户端两部分,其主要实现过程如下

四.实验流程

服务器端流程

1.创建socket

  socket是一个结构体,被创建在内核中

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

2.调用bind函数

  将socket和地址(包括ip、port)绑定。

  需要定义一个结构体地址,以便于将port的主机字节序转化成网络字节序

    struct sockaddr_in serveraddr;    //地址结构体

  bind函数

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

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

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

4.调用accept函数,从队列获取请求,返回socket描述符

  如果无请求,将会阻塞,直到获得链接

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

5.调用IO函数和客户端双向通信

6.关闭accept返回的socket

    close(fd);

服务器端代码:

 #include "iostream"
#include "netdb.h"
#include "stdio.h"
#include "stdlib.h"
#include "sys/socket.h"
#include "unistd.h"
#include "arpa/inet.h"
#include "string.h"
#include "memory.h"
#include "signal.h"
#include "time.h" int sockfd; void sig_handler(int signo)
{
if(signo==SIGINT)
{
printf("Server close \n");
close(sockfd);
exit();
}
} //输出连接上来的客户端相关信息
void out_addr(struct sockaddr_in *clientaddr)
{
//将端口从网络字节序转成主机字节序
int port =ntohs(clientaddr->sin_port);
char ip[];
memset (ip,,sizeof(ip));
inet_ntop(AF_INET,
&clientaddr->sin_addr.s_addr,ip,sizeof(ip));
printf("client:%s(%d)connected\n",ip,port);
} void do_service(int fd)
{
//获取系统时间
long t=time();
char *s=ctime(&t);
size_t size=strlen(s)*sizeof(char);
//将服务器端的系统时间写到客户端
if(write(fd,s,size)!=size)
{
perror("write error");
}
} int main(int argc,char *argv[])
{
if(argc<)
{
printf("usage:%s #port\n",argv[]);
exit();
} if(signal(SIGINT,sig_handler)==SIG_ERR)
{
perror("signal sigint error");
exit();
} /*1. 创建socket
AF_INT:ipv4
SOCK_STREAM:tcp协议
*/
sockfd=socket(AF_INET,SOCK_STREAM,);
if(sockfd<){
perror("socket error");
exit();
} /*2:调用bind函数绑定socket和地址*/ struct sockaddr_in serveraddr;
memset(&serveraddr,,sizeof(serveraddr));
//往地址中填入ip,port,internet类型
serveraddr.sin_family=AF_INET; //ipv4
serveraddr.sin_port=htons(atoi(argv[])); //htons主机字节序转成网络字节序 serveraddr.sin_addr.s_addr=INADDR_ANY; if(bind(sockfd,(struct sockaddr*)&serveraddr,sizeof(serveraddr))<)
{
perror("bind error");
exit(); } /*3:调用listen函数监听(指定port监听)
通知操作系统区接受来自客户顿的连接请求
第二个参数:指定队列长度
*/ if(listen(sockfd,)<)
{
perror("listen error"); } /*4:调用accept函数从队列中获得一个客户端的请求连接
*/ struct sockaddr_in clientaddr;
socklen_t clientaddr_len=sizeof(clientaddr); while(){
int fd=accept(sockfd,
(struct sockaddr*)&clientaddr,
&clientaddr_len);
if(fd<){
perror("accept error");
continue;
} /*5:调用IO函数(read/write)和
连接的客户端进行双向通信
*/
out_addr(&clientaddr);
do_service(fd); /*6.关闭socket*/
close(fd);
} return ;
}

客户端代码:

 #include "netdb.h"
#include "sys/socket.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "memory.h"
#include "unistd.h"
#include <arpa/inet.h> int main(int argc,char *argv[])
{
if(argc<)
{
printf("usage:%s ip port \n",argv[]);
exit();
} /*步骤1:创建socket*/
int sockfd=socket(AF_INET,SOCK_STREAM,);
if(sockfd<)
{
perror("socket error");
exit();
} struct sockaddr_in serveraddr;
memset(&serveraddr,,sizeof(serveraddr));
serveraddr.sin_family=AF_INET;
serveraddr.sin_port=htons(atoi(argv[])); //主机字节序转换成网络字节序
inet_pton(AF_INET,argv[],
&serveraddr.sin_addr.s_addr); /*步骤2:客户端调用connect函数连接到服务器 */
if(connect(sockfd,(struct sockaddr*)&serveraddr,
sizeof(serveraddr))<)
{
perror("connect error");
exit();
} /*步骤3:调用IO函数(read/write)和服务器端双向通信*/
char buffer[];
memset(buffer,,sizeof(buffer));
size_t size; if((size=read(sockfd,
buffer,sizeof(buffer)))<)
{
perror("read error");
} if(write(STDOUT_FILENO,buffer,size)!=size)
{
perror("write error");
}
}

实验结果:

基于TCP的客户端、服务器端socket编程的更多相关文章

  1. 基于TCP的客户端和服务器端的代码设计

    实验平台 linux 实验内容 编写TCP服务器和客户端程序,程序运行时服务器等待客户端连接.一旦连接成功,服务器显示客户端的IP地址和端口号,并向客户端发送字符串 实验原理 TCP是面向连接的通信, ...

  2. 基于TCP和UDP的socket

    为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...

  3. 基于Tcp协议的简单Socket通信实例(JAVA)

    好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络编程的基础,这里就不提了,只记录最简单易懂实用的东西. ...

  4. C++基于TCP和UDP的socket通信

    以下是关于socket编程的一个非常经典的例子: 服务端: #include <stdio.h> #include <Winsock2.h> //windows socket的 ...

  5. 基于socketserver实现并发的socket编程

    目录 一.基于TCP协议 1.1 server类 1.2 request类 1.3 继承关系 1.4 服务端 1.5 客户端 1.6 客户端1 二.基于UDP协议 2.1 服务端 2.2 客户端 2. ...

  6. 基于TCP/UDP协议的socket

    基于TCP协议的socket tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端 server端 import socket sk = socket.socket() sk.bind( ...

  7. 实验09——java基于TCP实现客户端与服务端通信

    TCP通信         需要先创建连接 - 并且在创建连接的过程中 需要经过三次握手        底层通过 流 发送数据 数据没有大小限制        可靠的传输机制 - 丢包重发 包的顺序的 ...

  8. TCP和UDP的Socket编程实验

    Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的.BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Lin ...

  9. java 网络编程 TCP协议 java 服务器和客户端 java socket编程

    一个 HelloWord 级别的 Java Socket 通信的例子.通讯过程:        先启动 Server 端,进入一个死循环以便一直监听某端口是否有连接请求.然后运行 Client 端,客 ...

随机推荐

  1. 如何上传整个项目或者是文件夹到github

    原文地址:https://www.cnblogs.com/cairsha/p/11430436.html   在做github个人主页的时候,使用github的readme写起来很麻烦,而且也不好加入 ...

  2. rpm操作

    --查找某个软件:abc rpm -qa |grep abc --删除某个软件:abc rpm -e --noscripts  abc

  3. 服务器iptables规则记录

    很多时候,我在我自己的VPS上面部署了Cobalt Strike,可是网上很多叼毛就会扫描我们的VPS,然后发现我们的Cobalt Strike,如果你还建有web delivery,还会被人家下载上 ...

  4. 什么是java的线程安全?同步,异步

    线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程 ...

  5. Windows 2016 安装单机版本Oracle ASM 的简单说明

    发现这样弄完 启动之后 就挂了 真蛋疼.  改天再研究一下. 1. 需要给磁盘处理一下 建议使用压缩卷的模式进行处理 如图示 需要新建简单卷 注意设置 然后不进行格式化 2. 然后安装oracle的g ...

  6. PHP中的data()函数

    date()是我们常用的一个日期时间函数,下面我来总结一下关于date()函数的各种形式的用法,有需要学习的朋友可参考. 格式化日期date() 函数的第一个参数规定了如何格式化日期/时间.它使用字母 ...

  7. NoSQL数据库简介与产生

    关系型数据库所存在“问题” >利用ACID原则(原子性,一致性,隔离性,持久性)保证数据完整性: >行列的规范化存储: >预定义结构: >存储数据量“小”: >结构化查询 ...

  8. 设计模式:备忘录模式(Memento)

    个人比较喜欢玩单机游戏,什么仙剑.古剑.鬼泣.使命召唤.三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传),对于这些游戏除了剧情好.场面大.爽快之外,还可以随时存档,等到下次想玩了又可以从刚开始的 ...

  9. # 匈牙利算法(二分图最大匹配)- hdu 过山车

    匈牙利算法(二分图最大匹配)- hdu 过山车 Hdu 2063 二分图:图中的点可以分成两组U,V,所有边都是连接U,V中的顶点.等价定义是:含奇数条边的图. 匹配:一个匹配是一个边的集合,其中任意 ...

  10. c语言:<tchar.h>

    头文件“<tchar.h>”作用就是为了进行ASCII码和UNICODE(wide-character)码的头文件(该头文件由微软提供): 这样我们就可以使用TCHAR.H头文件中的定义的 ...