1h2y3h 2021-12-06 21:21 采纳率: 0%
浏览 33
已结题

没有思路啊 有无懂哥!

实验目的及要求:
掌握TCP/IP网络套接字编程的工作原理,学会使用Winsock编制网络会话程序。
实验方法:

  1. 阅读文档,熟悉TCP/IP网络套接字编程的工作原理,参考本实验后附录的客户与服务器程序简例,实验前事先改编一个DOS命令行方式下的网络会话程序,要求双方能交替打入任意语句(一方打入语句后,停止、等待另一方回答,待对方回答后,再打入另一语句……,直至任一方键入一个ESC键为止,结束会话);

  2. 使用 tc/vc,输入、编辑、编译、运行与调试网络会话程序。

实验内容:

  1. 写出改编的 C++ Builder 网络会话源程序如下:
  2. 运行、测试网络会话程序,记录测试结果,分析遇到的问题与解决的办法;
  3. 总结 TCP/IP 网络套接字编程的一般编程步骤。
    [附录] C++ Builder TCP/IP 网络套接字编程简例:

SERVER.CPP:
/**************************************************************************
本程序为服务器端程序,通信任一方只要发送bye通信过程就自动结束。在面向连接通
信过程中服务器先与端口3000绑定,然后等待客户连接。连接成功后就可收发信息。
**************************************************************************/
#include <condefs.h>
#pragma hdrstop
//------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
//------------------------------------------------------------------------
#pragma argsused
bool InitSocket();

int main(int , char**)
{
struct sockaddr addr;
int len,off;
bool over;
char msg[255];
SOCKET sock ,sersock;

if( !InitSocket() ) return 0; //初始化Window Sockets DLL(ws2_32.dll)
//创建流Socket:即传输层使用TCP
sock = socket( AF_INET,SOCK_STREAM,0 );

if( sock==INVALID_SOCKET ){ //不能创建,返回
printf("不能创建Socket!");
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
//设置IP地址和端口号
((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议
((sockaddr_in*)&addr)->sin_port = htons(3000); //服务器端口号3000
((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr("202.195.143.10");//主机地址
//把套接字与地址绑定
bind(sock,&addr,sizeof(addr));
//监听网络连接
listen(sock,1); //监听连接:1--允许等待队列的长度
printf("等待客户连接!\n");
len = sizeof(addr);
//接受网络连接,生成新的套接字sersock标识这一连接
sersock = accept( sock,&addr,&len );
//从等待队列中检取客户,如队列空则进程挂起
//如不空,则接受并生成新Socket以表示此连接,而原Socket继续等待新客户
if(sersock==INVALID_SOCKET){
DWORD err = WSAGetLastError();
char txt[100];
sprintf(txt,"error when accept!---errno:%d",err);
printf(txt);
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
printf("有客户连接!\n输入bye通信结束\n");
over = false;
do{
printf("\n等待用户输入信息......");
len = recv ( sersock,msg,200,0 ); //接收用户信息
printf("收到信息:%s",msg);
if( strcmp(msg,"bye")==0 ){ //若收到bye就结束通信
printf(msg);break;
}
printf("输入信息:");gets(msg);
if( strcmp(msg,"bye")==0 ) over = true; //若发出bye就结束通信
send ( sersock,msg,strlen(msg)+1,0 ); //发出输入信息
}while( !over );
//关闭套接字
closesocket(sersock);
closesocket(sock);
printf("按任一键返回");
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
//---------------------------------------------------------------------
bool InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 0 );
//初始化Windows Sockets DLL,
err = WSAStartup( wVersionRequested, &wsaData );//加载Winsock DLL到内存
if ( err != 0 ) {
printf("没有Windows Socket动态库!\n");
getch();
return false;
}

if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) {
printf("需要Windows Socket 2!\n");
getch();
WSACleanup( ); //非winsock 2.0时,卸载Window Sockets DLL
return false;
}
return true;
}

CLIENT.CPP:
/**************************************************************************
本程序为客户端程序。通信的任一方只要发送bye通信过程就自动结束,在面向连接的
通信过程中,服务器首先启动,客户端启动后,先输入服务器的IP地址和端口号3000,
再与服务器端连接,连接成功后就可收发信息。
**************************************************************************/
#include <condefs.h>
#pragma hdrstop
//------------------------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <winsock2.h> //Windows Sockets函数定义
#include <stdlib.h>
//------------------------------------------------------------------------
#pragma argsused
bool InitSocket(); //初始化Windows Sockets动态连接库

int main(int , char**)
{
int type;
SOCKET sock; //套接字
struct sockaddr addr; //地址
int len,portno;
int err;
char msg[255];
bool over;
int i;

if( !InitSocket() ) return 0; //初始化Window Sockets DLL
type = SOCK_STREAM; //面向连接的流式Socket类型
sock = socket( AF_INET,type,0 ); //创建支持Internet协议的流式Socket
if( sock==INVALID_SOCKET ){ //不能创建,返回
printf("不能创建Socket!");
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
//客户端地址设定
((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议
((sockaddr_in*)&addr)->sin_port = 0; //客户端端口号:0--系统分配
((sockaddr_in*)&addr)->sin_addr.s_addr = 0; //主机地址:0--本机
bind(sock,&addr,sizeof(addr)); //把地址与Socket绑定
//输入服务器地址
((sockaddr_in*)&addr)->sin_family = AF_INET; //AF_INET:使用Internet 协议
printf("输入服务器地址(0.0.0.0):");
gets(msg);
if(msg[0]=='\0')
sprintf(msg,"0.0.0.0"); //如果直接回车,就采用默认设置(0.0.0.0):本机
((sockaddr_in*)&addr)->sin_addr.s_addr = inet_addr(msg); //服务器地址
printf("输入服务器端口号(3000):");
gets(msg);
if(msg[0]=='\0') portno=3000; //如果直接回车,就采用默认端口号3000
else portno=atoi(msg);
((sockaddr_in*)&addr)->sin_port = htons( portno ); //服务器端口号;
//htons():把主机表示的短整数转化成网络字节顺序
len = sizeof(addr);
printf("与服务器连接...!");
err = connect( sock,(sockaddr*)&addr,len );
//在使用面向连接协议时(TCP),必须与服务器连接成功后,才可通信
//在无连接协议(UDP)中,可以直接向对方发数据,而无需连接
if( err==SOCKET_ERROR ){
printf("连接失败!");
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
printf("成功连接到服务器!\n输入bye通信结束\n");
over = false;
do{
printf("\n输入信息:");
gets(msg);
if( strcmp(msg,"bye")==0 ) over = true; //输入“bye”则结束通信
send ( sock,msg,strlen(msg)+1,0 ); //发送输入信息
if(over) break;
printf("\n等待服务器响应......");
len = recv ( sock,msg,200,0 );
msg[len]=0; //接受信息
if( strcmp(msg,"bye")==0 ) over = true; //收到“bye”则结束通信
printf("收到信息:");
printf(msg); //显示接受信息
}while( !over );
closesocket(sock);
printf("按任一键返回");
getch();
WSACleanup( ); //卸载Window Sockets DLL
return 0;
}
//---------------------------------------------------------------------
bool InitSocket()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 2, 0 ); //Winsock2.0
//初始化Windows Sockets DLL,
err = WSAStartup( wVersionRequested, &wsaData ); //加载Winsock DLL到内存
if ( err != 0 ) {
printf("没有Windows Socket动态库!\n");
getch();
return false;
}

if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 0 ) {
printf("需要Windows Socket 2!\n");
getch();
WSACleanup( ); //非Winsock2.0时,卸载Window Sockets DLL
return false;
}
return true;
}

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-12-08 10:26
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月14日
  • 创建了问题 12月6日

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题