WinSock编程实验报告
班 级:10网工三班 学生姓名:谢昊天 学号:1215134046
实验目的和要求: 实验目的
1、了解WinsockAPI
2、深刻领会Winsock编程原理
3、学会使用Winsock创建简单的TCP服务器以及客户机 实验要求
1. 整个通信过程参照TCP/IP通信方式; 2. 实现整个TCP/IP通信的基本模型;
3. 完成基本的界面设计和事件响应;
4. 服务器可以同时和多个用户对话,可以同时恢复多个用户; 5. 保证信息传输的畅通;
6. 服务器可以依次和多个用户对话。
实验内容与分析设计:
编写一个基于某种I/O方法的TCP服务器和TCP客户机:能够实现模拟C/S模型的通信方式,服务器端负责信息的接收,并能够返回给客户端相应的消息;客户机负责向服务器发送信息。
注:可以模拟教材95页面向连接的TCP Socket应用程序编程实例。
实验步骤与调试过程:
1.打开Visual c++ 6.0编程环境;
2.点击文件->新建、选择建立新的工程;选择Win32 Console Application选项建立工程名为“服务器”的一个空工程;
3. 继续点击文件->新建、选择建立新的文件;选择C++ Source File选项建立在“服务器”工程下的名为“服务器”的文件; 4.编辑源程序->调试;
(1)定义头文件和常量,声明两个SOCKET对象,初始化SOCKET环境;(2)创建用于监听的SOCKET环境;(3)设置服务器SOCKET的地址,并绑定socket server 到本地地址,在socket server 上进行监听,而后调用accept()函数等待来自客户端的连接请求;(4)在服务器与客户机之间发送和接收数据;(5)当服务器程序接收到来自客户端的“quit”字符串后,将退出循环并释放占用的资源;
5.在组建选项中点击执行【服务器.exe】(或者Ctrl+F5)执行程序; 6.运行服务器查看服务器是否处于监听状态。
7.再次打开Visual c++ 6.0编程环境;
8.点击文件->新建、选择建立新的工程;选择Win32 Console Application选项建立工程名为“客户端”的一个空工程;
9. 继续点击文件->新建、选择建立新的文件;选择C++ Source File选项建立在“客户端”工程下的名为“客户端”的文件; 10.编辑源程序->调试;(1)在主程序中定义头文件和常量并声明变量,初始化socket 环境并创建用于通信的socket;(2)设置socket地址并连接到服务器;(3)在服务器与客户机之间发送和接收数据;(4)当程序退出while循环时将释放占用的资源; 11.在组建选项中点击执行【服务器.exe】(或者Ctrl+F5)执行程序;
12. 运行服务器程序后再次运行客户端程序在客户端的命令窗口中执行netstat-nao.查看客户端程序的状态。
实验结果:
1.实现了在服务器与客户端之间发送和接受数据。 2.运行服务器后,服务器处于监听状态
3. 实现了接受来自客户端的请求。
4.实现模拟C/S模型的通信方式,服务器端负责信息的接收,并能够返回给客户端相应的消息;客户机负责向服务器发送信息。
疑难小结:
通过本次试验,了解了socketb编程的一些基础知识,学习到了用socket 编写 服务器应用程序。学习到了设置服务器socket 地址,用socket 编写客户端应用程序,以及如何接受来自客户端的请求。从而使我对TCP Socket服务器应用程序有了进一步的了解,通过动手实现其TCP Socket服务器在TCP端口9990上进行监听,实现CP Socket客户端自动连接到指定服务器的TCP端口9990,然后提示用户输入向服务器发送的字符串,更加深刻的理解了TCP Socket服务器与客户端的特点。同时,在实验过程中,回顾书本上的理论知识,巩固了我的知识。
主要算法和程序清单: 服务器:
#include
#pragma comment(lib,\ #define BUF_SIZE 64
int main(int argc, TCHAR* argv[]) {
WSADATA wsd; SOCKET sServer; SOCKET sClient;
int retVal;
char buf[BUF_SIZE];
if(WSAStartup(MAKEWORD(2,2),&wsd) !=0)
{
printf(\ return 1; }
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET ==sServer) {
printf(\WSACleanup(); return -1;
}
SOCKADDR_IN addrServ;
addrServ.sin_family = AF_INET; addrServ.sin_port = htons(9990);
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
retVal = bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN)); if(SOCKET_ERROR == retVal) { printf(\
closesocket(sServer); WSACleanup();
return -1; }
retVal = listen(sServer,1); if(SOCKET_ERROR == retVal) {
printf(\closesocket(sServer); WSACleanup(); return -1;
}
printf(\sockaddr_in addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); if(INVALID_SOCKET == sClient) {
printf(\closesocket(sServer); WSACleanup(); return -1;
}
while(true) {
ZeroMemory(buf,BUF_SIZE); retVal = recv(sClient,buf,BUFSIZ,0); if(SOCKET_ERROR == retVal) { printf(\ }
SYSTEMTIME st; GetLocalTime(&st); char sDateTime[30];
closesocket(sServer); closesocket(sClient); WSACleanup(); return -1;
sprintf(sDateTime,\ear,st.wMonth,st.wHour,st.wMinute,st.wSecond);
printf(\From
[%s:%d] :%s\\n\ if(strcmp(buf,\
{
retVal = send(sClient,\ break; } else { }
char msg[BUF_SIZE];
sprintf(msg,\retVal = send(sClient, msg, strlen(msg),0); if(SOCKET_ERROR == retVal) { }
printf(\closesocket(sServer); closesocket(sClient); WSACleanup (); return -1;
Client
}
closesocket(sServer); closesocket(sClient); WSACleanup(); system(\return 0; }
客户端:
#include
#pragma comment(lib,\ #define BUF_SIZE 64
int main(int argc, TCHAR* argv[]) {
WSADATA wsd; SOCKET sHost;
SOCKADDR_IN servAddr; char buf[BUF_SIZE];
int retVal;
if (WSAStartup(MAKEWORD(2,2),&wsd) != 0) { }
sHost = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(INVALID_SOCKET == sHost) { printf(\ WSACleanup();
return -1;
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr(\servAddr.sin_port = htons(9990);
int sServerAddlen = sizeof(servAddr); printf (\return 1;
}
retVal = connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr)); if(SOCKET_ERROR == retVal) { } {
printf(\std::string str;
std::getline(std::cin, str); printf(\closesocket(sHost); WSACleanup(); return -1;
while(true)
}
ZeroMemory(buf,BUF_SIZE); strcpy(buf,str.c_str());
retVal = send(sHost,buf,strlen(buf),0); if(SOCKET_ERROR == retVal) { }
retVal = recv(sHost,buf,sizeof(buf)+1,0); printf(\if(strcmp(buf,\{
printf(\break;
printf(\closesocket(sHost); WSACleanup(); return -1;
} }
closesocket(sHost); WSACleanup(); system(\return 0;
Windows网络编程(一)——WinSock编程



