《网络程序设计》实验1_控制台方式Winsock流套接字客户服务器通信
网络编程中的套接字与流程控制

网络编程中的套接字与流程控制在网络编程中,套接字是实现网络通信的关键组件,而流程控制则是确保数据在网络中可靠传输的重要手段。
本文将就网络编程中的套接字和流程控制进行详细的讨论与分析。
一、套接字:实现网络通信的基础套接字是网络编程中用于实现通信连接的一种接口,它通过IP地址和端口号来标识一个网络通信终端。
网络编程中常用的套接字分类有TCP套接字和UDP套接字。
TCP套接字提供可靠的面向连接的通信,而UDP套接字则提供无连接的通信。
通过套接字,我们可以实现不同计算机之间的数据传输,使得网络编程成为可能。
在编写网络应用程序时,我们首先需要创建一个套接字,并设置相关的属性(如协议类型、IP地址、端口号等)。
然后,我们可以利用套接字进行数据的发送和接收操作,从而实现网络通信。
二、流程控制:确保数据传输的可靠性在网络编程中,数据的可靠传输是一个重要的问题。
由于网络通信可能受到各种因素(如网络拥塞、丢包等)的影响,数据在传输过程中可能会出现丢失、重复、乱序等问题。
为了确保数据的可靠传输,我们需要进行流程控制。
流程控制主要包括以下几个方面:确认应答、超时重传、滑动窗口和拥塞控制。
确认应答是指数据发送方收到数据接收方的确认信号后,才认为数据已经传输成功;超时重传是指当发送方在一定时间内未收到接收方的确认信号时,会重新发送数据;滑动窗口是指发送方和接收方通过一个固定大小的窗口来管理数据的发送和接收;拥塞控制是指通过监测网络的拥塞情况,调整数据的发送速率,以避免网络拥塞。
通过以上的流程控制机制,我们可以确保数据在网络中的可靠传输。
这些机制使得网络编程在不可靠的网络环境中也能够正常工作,并保证数据的准确性和完整性。
三、套接字与流程控制的应用实例为了更好地理解套接字与流程控制在网络编程中的应用,我们来看一个简单的示例。
假设有两台计算机A和B,它们之间需要进行文件传输。
计算机A首先创建一个TCP套接字,并设置相关属性(如IP地址、端口号等)。
计算机网络实验报告 winsock编程

计算机网络实验一:socket文件传输一、实验目地1、了解网络通信原理。
掌握客户端/服务器程序设计。
2、理解Socket通信原理,掌握使用ServerSocket类和Socket类进行TCPSocket通信的程序设计方法二、实验原理Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。
此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。
计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。
详细如图:我们来分析一下图,Host A上的程序A将一段信息写入Socket中,Socket 的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B 的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
Socket套接口有3种类型。
1.SOCK_STREAM流式套接口,面向连接的,可靠地,TCP。
2.SOCK_DRAM数据报套接口,面向无连接,不可靠,UDP。
3.原始套接口,主要用于新的网络协议实现的测试三、实验分析1、实验要求、按需求编写服务器端和客户端程序代码。
实现:(1)服务器端向客户端提供文件目录。
(2)客户端向服务器端发出请求下载文件。
(3)客户端向服务器端上传文件。
2、Socket通信工作过程如下(1)、建立连接服务器(ServerSocket)监听指定端口,看是否有客户端的连接请求;客户端(ClientServer)创建套接字并通过指定端口请求与服务器建立连接。
实验1基于流式套接字的网络程序设计(计算机网络Ⅱ)

实验1基于流式套接字的⽹络程序设计(计算机⽹络Ⅱ)实验1 基于流式套接字的⽹络程序设计⼀、实验环境操作系统:Win10开发⼯具:VS2017使⽤语⾔:C⼆、实验内容1.设计思路(1)流式套接字编程模型①通信过程服务器通信过程如下:1.socket初始化;2.创建套接字,指定使⽤TCP进⾏通信;3.指定本地地址和通信端⼝;4.等待客户端的连接请求;5.进⾏数据传输;6.关闭套接字;7.结束对Windows socket dll的使⽤。
客户端通信过程如下:1.socket初始化;2.创建套接字,指定使⽤TCP进⾏通信;3.指定服务器地址和通信端⼝;4.向服务器发送连接请求;5.进⾏数据传输;6.关闭套接字;7.结束对Windows socket dll的使⽤。
②客户-服务器交互模型在通常情况下,⾸先服务器处于监听状态,它随时等待客户连接请求的到来,⽽客户的连接请求则由客户根据需要随时发出;连接建⽴后,双⽅在连接通道上进⾏数据交互;在会话结束后,双⽅关闭连接。
由于服务器端的服务对象通常不限于单个,因此在服务器的函数设置上考虑了多个客户同时连接服务器的情形,基于流式套接字的客户-服务器交互模型如图1-1所⽰。
图1-1 基于流式套接字的客户-服务器交互模型服务器进程要先于客户进程启动,每个步骤中调⽤的套接字函数如下:1.调⽤WSAStartup()函数加载Windows Sockets DLL,然后调⽤socket()函数创建流式套接字,返回套接字s;2.调⽤bind()函数将套接字s绑定到⼀个本地的端点地址上;3.调⽤listen()将套接字s设置为监听模式,准备好接受来⾃各个客户的连接请求;4.调⽤accept()函数等待接受客户的连接请求;5.如果接受到客户的连接请求,则accept()函数返回,得到新的套接字ns;6.调⽤recv()函数在套接字ns上接收来⾃客户的数据;7.处理客户的服务器请求;8.调⽤send()函数在套接字ns上向客户发送数据;9.与客户结束通信后,由客户进程断开连接。
网络程序设计实验报告-Winsock编程接口实验

网络程序设计实验报告实验名称: Winsock编程接口实验实验类型:____验证型实验_____ __指导教师:______________________专业班级:_____________________姓名:_______________________学号:_____________________电子邮件:____________实验地点:______ _______实验日期2013 年 3 月29 日实验成绩:__________________________一、实验目的●掌握Winsock的启动和初始化;●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计由实验内容可以知道:1、编写程序能同时实现对多个域名的解析。
比如在控制台输入:getip ,能输出和对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。
首先要了解一些基本的知识gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的基本知识gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。
结构的声明与gethostaddr()中一致。
之后要根据内容画出函数流程图三、实验过程(包含实验结果)1.在实验过程中调用GetAdaptersInfo()时,出现了undeclared identifier的报错,原因是没有包含其头文件,之后进行一些修改解决了问题.2.实验结果3.选择查看本机信息四、讨论与分析1.Winsock初始化的作用是什么?答:使用winsock初始化可加载winsock编程的动态链接库。
2.给出GetAdaptersInfo()函数的正确使用方法。
GetAdaptersInfo 函数使用方法:1.包含头文件IpHlpApi.h,其库文件为IpHlpApi.lib(已将安装SDK,并将其连接至VC)2.声明一个IP_ADAPTER_INFO 结构指针变量pAdapterInfo,一个ULONG变量ulOutBufLen。
C语言网络编程套接字编程和网络通信的基本原理

C语言网络编程套接字编程和网络通信的基本原理C语言是一门广泛应用于系统开发和嵌入式编程的编程语言。
在网络编程领域,在C语言中,我们使用套接字(socket)来实现网络通信。
套接字编程是网络编程的核心内容之一,对于理解网络通信的基本原理至关重要。
一、套接字编程概述套接字是一种通信端点,套接字编程通过套接字链接两个计算机,使它们能够进行数据交换和通信。
在C语言中,我们使用socket函数创建和操作套接字。
套接字编程允许我们建立客户端和服务器端的通信连接。
二、C语言网络编程基本步骤1. 创建套接字:C语言中使用socket函数创建套接字。
该函数返回一个整数作为套接字描述符,以便在后续的通信中进行引用。
2. 绑定套接字:服务器端需要将套接字绑定到一个特定的IP地址和端口号上,以便客户端能够连接到该地址和端口。
我们使用bind函数来实现这一步骤。
3. 监听连接请求:服务器端使用listen函数开始监听来自客户端的连接请求。
该函数将套接字设置为被动模式,等待客户端的连接。
4. 接受连接请求:服务器端使用accept函数来接受客户端的连接请求。
该函数返回一个新的套接字文件描述符,该描述符用于与特定客户端进行通信。
5. 发送和接收数据:一旦建立连接,客户端和服务器端就可以使用send和recv函数来发送和接收数据。
send函数用于发送数据,recv函数用于接收数据。
6. 关闭套接字:当通信完成后,服务器端和客户端都应该用close函数来关闭套接字,以释放资源。
三、网络通信的基本原理1. IP地址和端口号:在网络通信中,每台计算机都有一个唯一的IP 地址,用于标识该计算机在网络中的位置。
端口号则用于标识计算机上的进程或服务。
客户端和服务器端通过IP地址和端口号来建立连接。
2. TCP和UDP协议:在C语言套接字编程中,常用的两种网络通信协议是TCP(传输控制协议)和UDP(用户数据报协议)。
TCP协议提供可靠的、面向连接的数据传输,而UDP协议则是无连接的、不可靠的数据传输。
C语言网络编程及套接字使用

C语言网络编程及套接字使用网络编程是指使用网络技术和协议在计算机之间进行数据交流和通信的过程。
在C语言中,通过使用套接字(socket)来实现网络编程。
套接字提供了一种用于网络通信的接口,使得程序能够在不同计算机之间进行数据传输。
一、套接字概述套接字是一种提供了网络通信功能的抽象。
在C语言中,通过套接字可以创建一个端点,以实现与其他主机或进程的通信。
套接字使用传输层协议(如TCP或UDP)来建立连接,并通过网络进行数据传输。
二、套接字的创建与绑定要使用套接字进行网络编程,首先需要创建一个套接字。
C语言中可以使用socket函数来创建套接字。
该函数接受三个参数:地址族(常用的为AF_INET表示IPv4)、套接字类型(常用的为SOCK_STREAM表示TCP套接字)以及协议(常用的为0表示默认协议)。
创建套接字后,还需要将套接字与一个本地地址绑定起来,以便能够接收外部传入的连接请求。
可以使用bind函数来实现套接字的绑定。
bind函数接受套接字描述符、本地地址结构体以及地址结构体的大小作为参数。
三、套接字的连接与监听若希望作为客户端与服务器进行通信,则需要连接到远程服务器。
可以使用connect函数来实现套接字的连接。
connect函数接受套接字描述符、服务器地址结构体以及地址结构体的大小作为参数。
若希望作为服务器接受客户端连接,则需要将套接字设置为监听模式。
可以使用listen函数来实现套接字的监听。
listen函数接受套接字描述符以及监听队列的长度作为参数。
四、套接字的读写操作套接字的读写操作是实现网络通信的核心部分。
通过套接字可以发送和接收数据。
可以使用send和recv函数来实现套接字的读写操作。
send函数接受套接字描述符、发送缓冲区、发送数据长度以及其他参数。
在使用套接字进行读写操作时,常常需要处理粘包和分包问题。
为了确保数据的完整性和准确性,可以定义一定的协议来进行数据的分割和解析。
winsock编程实验报告
winsock编程实验报告Winsock编程实验报告引言:Winsock(Windows Socket)是一种用于网络通信的编程接口,常用于开发基于TCP/IP协议的应用程序。
本篇文章将介绍我对Winsock编程的实验经历和心得体会。
实验目的:通过Winsock编程实验,深入了解网络通信原理和技术,掌握基于TCP/IP协议的应用程序开发方法。
实验环境:本次实验在Windows操作系统下进行,使用了Visual Studio 2019作为开发工具。
实验过程:1. 实验一:建立基于TCP的客户端/服务器通信在这个实验中,我首先创建了一个服务器程序和一个客户端程序。
服务器程序使用Winsock库函数创建了一个套接字,并绑定到指定的IP地址和端口上。
客户端程序通过Winsock库函数创建了一个套接字,并连接到服务器的IP地址和端口上。
通过这个实验,我学会了如何建立基于TCP的客户端/服务器通信。
2. 实验二:实现基于UDP的数据传输在这个实验中,我创建了一个基于UDP的数据传输程序。
UDP是一种无连接的传输协议,相对于TCP来说,它更加轻量级,适用于一些对数据可靠性要求不高的应用场景。
通过这个实验,我学会了如何使用Winsock库函数实现基于UDP的数据传输。
3. 实验三:实现多线程服务器在这个实验中,我将服务器程序改为多线程模式。
通过创建多个线程,服务器可以同时处理多个客户端的请求,提高了系统的并发性能。
这个实验让我更加深入地理解了多线程编程和网络通信的结合。
实验结果与分析:通过以上实验,我成功地实现了基于TCP和UDP的网络通信,并且在实验三中实现了多线程服务器。
在实验过程中,我遇到了一些问题,比如套接字的创建和绑定、连接的建立和断开等。
但通过查阅文档和调试,我最终解决了这些问题。
实验结果表明,Winsock编程是一种强大且灵活的工具,可以满足各种网络通信需求。
实验心得:通过本次实验,我对Winsock编程有了更深入的了解。
实现基于TCP套接字的简单的服务器与客户端通信实验报告
计算机科学与技术系实验(项目)报告一、基本信息二、目的与要求目的:通过实验掌握Linux环境下基于TCP套接字编程的基本步骤和方法。
要求:1.掌握网络编程的基本框架;2.了解客户端、服务器的基本概念;3.掌握TCP套接字编程的基本流程及程序的调试方法。
三、完成实验(项目)过程和效果内容:1.程序结构设计;2.程序数据设计;3.程序基本流程;4.编码、调试及运行。
server代码:client代码:步骤:1.程序结构设计1)服务器端结构先启动,进行socket、bind、listen、accept、一系列准备工作,然后如果没有建立连接,则服务器处于阻塞状态,等待客户端连接。
2)客户端结构。
客户端启动后,首先向服务器端发起建立连接的请求,得到同意后,连接建立成功,客户端和服务器端开始进行数据通信,客户机完成通信工程后释放链接,关闭套接字。
2.程序数据设计1)服务器端相关数据:监听套接字描述符、连接套接字描述符int sockfd,client_fd;服务器端地址struct sockaddr_in my_addr客户端地址struct sockaddr_in remote_addr2)客户端相关数据套接字描述符int sockfd;服务器端地址结构struct sockaddr_in serv_addr;保存接收到的数据char buf[MAXDATASIZE];接收的数据字符int recvbytes;3.程序基本流程图。
四、知识应用以及经验总结1.编写UDP通信程序?基于UDP协议进行通信不同于TCP,UDP套接字通讯方式是一种面向无连接的通信工程,通信双方不必建立连接即三次握手。
指定IP即可通信,但不可靠。
2.监听套接字和连接套接字的区别?监听套接字,用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。
当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
计算机网络实验一_Windows_Socket_编程
6
Socket套接字
目标:学习如何建立客户端/服务器应用程序,使用套接字 进行通信
套接字(socket): 应用进程之间的接口,实现端到端的传输
协议
应用层
进程
传输层 网络层 数据链路层 物理层
套接字
Internet
应用层
进程
传输层 网络层 数据链路层 物理层
由应用 开发者 控制
由操作 系统控制
Socket API 类别
PF_INET : 用于互联网编程 PF_UNIX: 用于Unix 管道编程
PF_PACKET:直接访问网络接口 (i.e, 绕过TCP / IP协议栈)
两种基本socket API分别支持两种传输服务:
SOCK_STREAM: 可靠的,字节流服务 (TCP) SOCK_DGRAM: 非可靠的数据报服务 (UDP)
90年代初,由Microsoft联合其他几家公司共同制 定了一套Windows下的网络编程接口,即Windows Socket规范。它是Berkeley Socket的重要扩充,主要 是增加了一些异步函数,并增加了符合Windows消 息驱动特性的网络事件异步选择机制。WinSock规 范是一套开放的、支持多种协议的Windows下的网 络编程接口。从1991年的1.0版到1995年的2.0.8版, 经过不断完善,已成为Windows网络编程的事实上 的标准。
7
WinSock DLL
WinSock与操作系统的关系
应用程序 1
应用程序 2
网络编程接口 ——如 WinSock API 网络通信协议 ——如 TCP/IP协议
操作系统 ——如 Windows 物理通信介质
动态链接库
16位版:WINSOCK.DLL 32位版:W不可靠数据报 可靠的,面向字节流的数据报
C语言网络编程与套接字
C语言网络编程与套接字C语言网络编程是指使用C语言编写网络应用程序的技术。
这种编程技术使用套接字来实现数据通信。
套接字是一种抽象概念,它允许不同的计算机之间进行数据传输和通信。
在本文中,我们将探讨C语言网络编程的基本原理和使用套接字的方法。
1. 套接字的基本概念套接字是一种通信机制,它定义了计算机之间通信的规则和方式。
套接字由一个IP地址和一个端口号组成。
IP地址用于标识计算机,端口号用于标识应用程序。
套接字可以是连接还是无连接的。
连接套接字用于可靠的数据传输,而无连接套接字用于快速的数据传输。
2. 套接字编程的基本步骤套接字编程的基本步骤包括创建套接字、绑定套接字到一个地址、监听连接请求、接受连接请求、发送和接收数据。
下面我们将逐步介绍这些步骤。
2.1 创建套接字创建套接字是指在操作系统中分配一个套接字对象,并返回一个文件描述符或者套接字描述符。
套接字描述符用于后续的套接字操作。
2.2 绑定套接字到一个地址绑定套接字是指将套接字和一个IP地址以及一个端口号关联起来。
这样其他的计算机就可以用这个IP地址和端口号来访问这个套接字。
2.3 监听连接请求监听连接请求是指将套接字设置为监听状态,等待其他计算机的连接请求。
一旦有连接请求到达,操作系统会把连接请求放入等待队列中,等待应用程序处理。
2.4 接受连接请求接受连接请求是指从等待队列中取出一个连接请求,并建立起与请求主机之间的连接。
接受连接请求后,套接字就可以用于数据传输。
2.5 发送和接收数据通过套接字可以进行数据的发送和接收。
发送数据时,应用程序将数据写入套接字缓冲区,操作系统将数据传输给目标计算机。
接收数据时,应用程序从套接字缓冲区读取数据,操作系统将数据从源计算机传输给目标计算机。
3. C语言网络编程的实例下面是一个简单的C语言网络编程的实例,演示了服务器端和客户端的交互流程。
服务器端代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>int main(){// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {perror("Error opening socket");exit(1);}// 绑定套接字到一个地址struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8080);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {perror("Error binding socket");exit(1);}// 监听连接请求if (listen(sockfd, 5) < 0) {perror("Error listening");exit(1);}// 接受连接请求int client_sockfd;struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr);client_sockfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);if (client_sockfd < 0) {perror("Error accepting connection");exit(1);}// 发送和接收数据char buffer[256];while (1) {bzero(buffer, sizeof(buffer));read(client_sockfd, buffer, sizeof(buffer)); printf("Client: %s", buffer);bzero(buffer, sizeof(buffer));printf("Server: ");fgets(buffer, sizeof(buffer), stdin);write(client_sockfd, buffer, sizeof(buffer)); if (strncmp(buffer, "bye", 3) == 0)break;}// 关闭套接字close(client_sockfd);close(sockfd);return 0;}客户端代码:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>int main(){// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) {perror("Error opening socket");exit(1);}// 获取服务器地址信息struct hostent* server = gethostbyname("localhost"); if (server == NULL) {perror("Error getting host address");exit(1);}// 连接服务器struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;bcopy(server->h_addr, &server_addr.sin_addr.s_addr, server->h_length);server_addr.sin_port = htons(8080);if (connect(sockfd, (struct sockaddr*)&server_addr,sizeof(server_addr)) < 0) {perror("Error connecting to server");exit(1);}// 发送和接收数据char buffer[256];while (1) {bzero(buffer, sizeof(buffer));printf("Client: ");fgets(buffer, sizeof(buffer), stdin);write(sockfd, buffer, sizeof(buffer));if (strncmp(buffer, "bye", 3) == 0)break;bzero(buffer, sizeof(buffer));read(sockfd, buffer, sizeof(buffer));printf("Server: %s", buffer);}// 关闭套接字close(sockfd);return 0;}这个实例演示了一个简单的聊天程序,服务器端和客户端可以相互发送消息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("connect failed!\n");
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
}
//向服务器发送数据
while (1) {
ZeroMemory(buf, BUF_SZIE);
gets(buf);
retVal = send(sHost, buf, strlen(buf), 0);
实验报告内容包括主要的实验代码、必要的注释或另外的说明文档以及实验结果与分析。
服务器程序
#include <stdio.h>
#define BUF_SZIE64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATAwsd;//WSADATA变量
SOCKETsServer;//服务器套接字
SOCKETsClient;//客户端套接字
SOCKADDR_INaddrServ;;//服务器地址
charbuf[BUF_SZIE];//接收数据缓冲区
char bufSend[BUF_SZIE];//发送数据缓冲区
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源;
return 0;
}
客户端程序
#include <stdio.h>
#defineBUF_SZIE 64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
intretVal;//返回值
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return -1;
}
//创建套接字
sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sHost)
{
printf("socket failed!\n");
WSACleanup();//释放套接字资源
return -1;
}
//设置服务器地址
servAddr.sin_family =AF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //该inet_addr函数将字符串包含一个互联网协议地址(IPv4)点到一个适当的地址为in_addr结构。
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
//开始监听
retVal = listen(sServer,1);
if(SOCKET_ERROR == retVal)
{
printf("listen failed!\n");
closesocket(sServer);//关闭套接字
if (SOCKET_ERROR == retVal){
printf("recv failed!\n");
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
}
printf("%s\n", recvBuf);
}
//退出
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
printf("%s,你好!你是连接我的第%d个客户。\n", buf,n);//输出name
//向客户端发送数据
char str1[100],str2[100];
itoa(n, str1, 10);
strcpy(bufSend , "You are the ");
retVal = recv(sClient, buf, BUF_SZIE, 0);
if (SOCKET_ERROR == retVal)
{
printf("recv failed!\n");
closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
苏州大学实验报告
院、系
文正学院
年级专业
12物联网
姓名
高成波
学号
1217443036
课程名称
网络程序设计
成绩
指导教师
陆建德
同组实验者
无
实验日期
实验名称
实验一控制台方式Winsock流套接字客户服务器通信
一.实验内容(要求先完成题目,然后上机验证)
本实验利用Winsock API进行网络程序设计。参照课本示例,完成控制台方式下流式套接字C/S通信的客户与服务器端程序,并上机调试。要求可以实现本机两进程间以及在同一网络内不同主机之间的通信,要求做到:每次客户端向服务器发出请求、报出自己的姓名name,服务器回答一条消息给客户:“name,你好!你是访问我服务的第num个用户。”,客户端收到该消息后在自己的屏幕上显示。
int main(int argc, char* argv[])
{
WSADATAwsd;//WSADATA变量
SOCKETsHost; //服务器套接字
SOCKADDR_INservAddr;//服务器地址
charbuf[BUF_SZIE];//接收数据缓冲区
char recvBuf[BUF_SZIE];//发送数据缓冲区
if (SOCKET_ERROR == retVal)
{
printf("send failed!\n");
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return -1;
}
//接收数据
retVal = recv(sHost, recvBuf, BUF_SZIE, 0);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
printf("bind failed!\n");
strcpy(str2 , "th one connected to me.");
strcat(bufSend , str1);
strcat(bufSend , str2);
n = atoi(str1);
retVal = send(sClient, bufSend, strlen(bufSend) +1, 0);
if(INVALID_SOCKET == sClient)
{
printf("accept failed!\n");
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return -1;
}
//接收客户端数据
for( ; ; ){
ZeroMemory(buf, BUF_SZIE);
intretVal;//返回值
inቤተ መጻሕፍቲ ባይዱ n=1; //计数
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
servAddr.sin_port = htons(6000);
intnServAddlen = sizeof(servAddr);
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
if (SOCKET_ERROR == retVal)
{
printf("send failed!\n");
closesocket(sClient);//关闭套接字
closesocket(sServer);
WSACleanup();//释放套接字资源
return -1;
}
n++;
}
//退出
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源
return 0;
}
实验结果:在客户端窗口输入姓名后,服务器端窗口会返回一个语句告诉客户端是第几个连接到上面的用户。同时,在客户端也会有相应的反馈语句,并且可以连续输入。