资源描述
苏州大学实验报告
院、系
文正学院
年级专业
12物联网
姓名
高成波
学号
1217443036
课程名称
网络程序设计
成绩
指导教师
陆建德
同组实验者
无
实验日期
第5页,共5页
教务处制
实 验 名 称
实验一 控制台方式Winsock流套接字客户服务器通信
一. 实验内容(要求先完成题目,然后上机验证)
本实验利用Winsock API进行网络程序设计。参照课本示例,完成控制台方式下流式套接字C/S通信的客户与服务器端程序,并上机调试。要求可以实现本机两进程间以及在同一网络内不同主机之间的通信,要求做到:每次客户端向服务器发出请求、报出自己的姓名name,服务器回答一条消息给客户:“name,你好!你是访问我服务的第num个用户。”,客户端收到该消息后在自己的屏幕上显示。
实验报告内容包括主要的实验代码、必要的注释或另外的说明文档以及实验结果与分析。
服务器程序
#include <stdio.h>
#define BUF_SZIE 64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sServer; //服务器套接字
SOCKET sClient; //客户端套接字
SOCKADDR_IN addrServ;; //服务器地址
char buf[BUF_SZIE]; //接收数据缓冲区
char bufSend[BUF_SZIE];//发送数据缓冲区
int retVal; //返回值
int n=1; //计数
//初始化套结字动态库
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
//创建套接字
sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sServer)
{
printf("socket failed!\n");
WSACleanup();//释放套接字资源;
return -1;
}
//服务器套接字地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(6000);
addrServ.sin_addr.s_addr = INADDR_ANY;
//绑定套接字
retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
if(SOCKET_ERROR == retVal)
{
printf("bind failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
//开始监听
retVal = listen(sServer,1);
if(SOCKET_ERROR == retVal)
{
printf("listen failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
//接受客户端请求
sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);
if(INVALID_SOCKET == sClient)
{
printf("accept failed!\n");
closesocket(sServer); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
//接收客户端数据
for( ; ; ){
ZeroMemory(buf, BUF_SZIE);
retVal = recv(sClient, buf, BUF_SZIE, 0);
if (SOCKET_ERROR == retVal)
{
printf("recv failed!\n");
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源;
return -1;
}
printf("%s,你好!你是连接我的第%d个客户。\n", buf,n); //输出name
//向客户端发送数据
char str1[100],str2[100];
itoa(n, str1, 10);
strcpy(bufSend , "You are the ");
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 (SOCKET_ERROR == retVal)
{
printf("send failed!\n");
closesocket(sClient);//关闭套接字
closesocket(sServer);
WSACleanup(); //释放套接字资源
return -1;
}
n++;
}
//退出
closesocket(sServer); //关闭套接字
closesocket(sClient); //关闭套接字
WSACleanup(); //释放套接字资源;
return 0;
}
客户端程序
#include <stdio.h>
#define BUF_SZIE 64
#include "winsock2.h"
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsd; //WSADATA变量
SOCKET sHost; //服务器套接字
SOCKADDR_IN servAddr; //服务器地址
char buf[BUF_SZIE]; //接收数据缓冲区
char recvBuf[BUF_SZIE];//发送数据缓冲区
int retVal; //返回值
//初始化套结字动态库
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结构。
servAddr.sin_port = htons(6000);
int nServAddlen = sizeof(servAddr);
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr, sizeof(servAddr));
if(SOCKET_ERROR == retVal)
{
printf("connect failed!\n");
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//向服务器发送数据
while (1) {
ZeroMemory(buf, BUF_SZIE);
gets(buf);
retVal = send(sHost, buf, strlen(buf), 0);
if (SOCKET_ERROR == retVal)
{
printf("send failed!\n");
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
//接收数据
retVal = recv(sHost, recvBuf, BUF_SZIE, 0);
if (SOCKET_ERROR == retVal){
printf("recv failed!\n");
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return -1;
}
printf("%s\n", recvBuf);
}
//退出
closesocket(sHost); //关闭套接字
WSACleanup(); //释放套接字资源
return 0;
}
实验结果:在客户端窗口输入姓名后,服务器端窗口会返回一个语句告诉客户端是第几个连接到上面的用户。同时,在客户端也会有相应的反馈语句,并且可以连续输入。
实验分析:本次实验的前半部分,即由客户端输入名字,在服务器端显示是第几个用户,这部分做得比较顺利,但是由于send函数和receive函数的运用不熟练,后面由服务器反馈给客户端并在客户端显示是第几个客户这部分做的不好,但是后来经过和同学讨论等方法,我还是将程序做出来了,今后还要加强对一些函数的学习,尤其是要熟练运用。这是学网络编程课以来第一次上机实验,是新奇的,通过这次实践,让我熟悉了一下网络编程的编程环境,希望对今后的实验有帮助!
展开阅读全文