1、打开客户端(client.exe),根据提示,将客户端(server.exe)所在的服务器的 IP 地址输入进去。第四步:输入在服务器端(server.exe)中建立的端口号值。第五步:选择和服务器端(server.exe)中一样的协议 第六步:收发数据 第七步:关闭连接。2.2 原理说明书 2.3 程序注释/*client.c-简单的 TCP/UDP 套接字客户程序 windows 环境*/#include/关于套接字的头文件#include#include#include#include#pragma comment(Iib,ws2_32)添加 ws2_32 库 int main(void
2、)unsigned short port=5001;/端口号 int socket_type=SOCK_STREAM;/缺省使用 TCP 连接 char Buffer1280;/收发缓冲区 套接字地址结构变量 struct sockaddr_in server,from;/指针 /先输入客户程序所需要的基本信息:服务器地址,端口号,套接字类型 printf(请输入服务器地址:);scanf(%s,Buffer);printf(请输入端口号(5000):scanf(%d,&i);if(i 65535)printf(不正确的端口号d,用缺省端口号 5001n,i);else port=i;prin
3、tf(请输入套接字类型(1,TCP;2,UDP):if(i=1)socket_type=SOCK_STREAM;设定为 SOCK_STREAM else if(i=2)socket_type=SOCK_DGRAM;设定为 SOCK_DGRAM else printf(”不正确的输入d使用 TCP 数据流n,i);/在 windows 环境下,需要先初始化协议栈 if(retval=WSAStartup(0 x202,&wsaData)!=0)/WSAStartup 函数调用,用来初始/socket printf(WSAStartup 失败,错误号:%dn,retvaI);WSACIeanup(
4、);/当调用了 WSAStartup 之后,就需要调用 WSACIea nu 函 数释放内存 return-1;/取得主机 IP 地址 是域名或命名地址,用首字母的 if(isaIpha(Buffer0)/从一个主机数据库中提 是否在 A-Z,或者 a-z 来判断是域名还是 IP 地址 hp=gethostbyname(Buffer);/取出主机信息 else addr=inet_addr(Buffer);/是点分地址 hp=gethostbyaddr(char*)&addr,4,AF_INET);/根据 网络地址,获得主机信息,执行成功,就返回一个指向主机信息的 结构 if(hp=NULL)
5、printf(不 能 解 析 地 址%s:错 误 号%dn,Buffer,WSAGetLastError();/用于获取错误信息 WSACleanup();exit(1);/拷贝 解析的信息到 sockaddr_in 结构中 memset(&server,0,sizeof(server);/分 配 内 存 空 间,由 server 返回 memcpy(&(server.sin_addr),hp-h_addr,hp-h_length);/信息的 copy server.sin_family=hp-h_addrtype;/组协议初始化 server.sin_port=htons(port);/端口
6、号初始化/建立套接字 conn_socket=socket(AF_INET,socket_type,0);if(conn_socket h_name);(connect(conn_socket,(struct sockaddr*)&server,sizeof(server)=SOCKET_ERROR)printf(connect()失 败,错 号:%dn,WSAGetLastError();closesocket(conn_socket);/如果创建失败,就关 闭连接套接字 WSACleanup();return-1;while(1)/得到要发送的信息字符串 puts(n 输入送到服务器的信息
7、:gets(Buffer);if(!strlen(Buffer)/如果没有输入信息,继续循环 continue;/发送网络信息 strlen(Buffer)+1,0);/面向 tcp,类似 BSD write()else retval=sendto(conn_socket,Buffer,strlen(Buffer)+1,0,/发送字符串的时候,须将字符串的结束符 0 发送(struct sockaddr*)&server,sizeof(server);/面向 UDP if(retval=SOCKET_ERROR)printf(发 送 失 败,错 误 号:break;else printf(发送
8、信息:%sn,Buffer);/接收网络信息 i=sizeof(from);sizeof(Buffer),0);/面向 tcp,类似 BSD read()else retval=recvfrom(conn_socket,Buffer,sizeof(Buffer),0,(struct sockaddr*)&from,&/面向 UDP if(retval=SOCKET_ERROR)printf(接 收 信 息 失 败,错 误 号:else if(retval=0)/对于面向连接的套接字,需 要判断对方是否关闭连接 printf(服务器关闭连接 n);%s n,retval,windows 环境 e
9、lse/正确接收到网络信息 printf(收到%d 字节信息:Buffer);/程序的一个退出条件 if(!stricmp(Buffer,quit)break;/关闭套接字 closesocket(conn_socket);WSACleanup();return 0;/*server.c-简单 TCP/UDP 套接字服务器程序*/#include/套接字头文件#include#include#include#include#pragma comment(lib,ws2_32)/添加库 int main(void)unsigned short port=5001;int socket_type=
10、SOCK_DGRAM;char Buffer1024;int retval,fromlen,i,isconnected=0;变量 struct sockaddr_in local,from;量 SOCKET listen_socket,msgsock;/WSADATA wsaData;息/端口号/缺省使用 TCP 连接/收发缓冲区/临 时/套接字地址结构变 套接字变量/windows 套接字信/先输入服务器程序所需要的基本信息:端口号,套接字类型 printf(请输入端口号(5000):if(i 65535)printf(不正确的端口号d用缺省端口号 5001n,i);2,UDP):else
11、if(i=2)socket_type=SOCK_DGRAM;else printf(”不正确的输入d使用 TCP 数据流n,i);=0)/初 始化套接字版本等信息 printf(WSAStartup 失败,错误号:%dn,retval);/在创建失败,或者程序结束,都要调用 return-1;/建立套接字 listen_socket=socket(AF_INET,socket_type,0);if(listen_socket=INVALID_SOCKET)printf(socket()失 败,错 误 号:/拷贝 解析的信息到 sockaddr_in 结构中 local.sin_family=A
12、F_INET;local.sin_addr.s_addr=INADDR_ANY;local.sin_port=htons(port);/邦定网络地址到套接字 if(bind(listen_socket,(struct sockaddr*)&local,sizeof(local)=SOCKET_ERROR)/绑定网络地址 printf(bind()失 败,错 误 号:/对于流式套接字,让套接字处于监听状态,等待连接到来 if(socket_type!=SOCK_DGRAM)if(listen(listen_socket,5)=SOCKET_ERROR/)监 听网络 printf(listen()
13、失 败,错 误 号:printf(监听端口:%d,使用协议:%sn,port,(socket_type=SOCK_STREAM)TCP:UDP);while(1)fromlen=sizeof(from);if(socket_type=SOCK_DGRAM)msgsock=listen_socket;else if(isconnected=0)/对于 TCP 连接,如果没有连接,等待一个连接的到来 msgsock=accept(listen_socket,(struct sockaddr*)&fromlen);if(msgsock=INVALID_SOCKET)printf(accept()失
14、败,错 误 号:isconnected=1;printf(从%s 收 到 连 接,端 口 是:%dn,inet_ntoa(from.sin_addr),htons(from.sin_port);/等待接收网络信息 if(socket_type!=SOCK_DGRAM)retval=recv(msgsock,Buffer,sizeof(Buffer),0);/面向 tcp,类似 BSD read()else retval=recvfrom(msgsock,Buffer,sizeof(Buffer),0,(struct sockaddr*)&/面向 UDP printf(从%s 收 到 数 据 报
15、,端 口 是:/结果判断 if(retval=SOCKET_ERROR)printf(recv()失 败,错 误 号:closesocket(msgsock);continue;else if(retval=0)printf(客户端关闭连接 n);else/正常接收 printf(收到%d 字节的数据:%s n,retval,Buffer);if(socket_type!=SOCK_DGRAM)/对于 TCP 连接,我们收到 exit 有一个关闭连 接的操作 if(!stricmp(Buffer,exit)printf(关闭 TCP 连接,等待下一次 连接.n);isconnected=0;/
16、信息回送 printf(将同样的信息回送给客户端.nn);printf(please input the message:n);=SOCK_DGRAM)retval=send(msgsock,Buffer,strlen(Buffer)+1,0);/面向 tcp,类似 BSD write()else retval=sendto(msgsock,Buffer,strlen(Buffer)+1,0,(struct sockaddr*)&from,fromlen);/面向 UDP if(retval=SOCKET_ERROR)printf(send()失 败,错 误 号:3.连接数据库连接数据库 3.
17、1使用说明书 第一步:在开始菜单中找到 SQL SERVE 并打开 第二步:建立一个新的数据库。在 SQL SERVER建立一个名为 student 的数据库 第三步:在 student 库下创建一个 Stu_Info 表,并在表中包含以 下字段名:snum,sname,ssex,sage,smajor。输入一些数据,进 行测试。在安全性中设置密码为 123.第三步:编译生成可执行的文件,点击运行。根据提示框中的信息,输入我们需要插入的数据。关闭程序 第四步:在次点击运行,查看我们插入的数据是否成功的插入。3.2原理说明 通过 ADO访问数据库的技术进行数据库编程。我们需要在计算机上 配置数据
18、源。配置数据源的过程,就是和让数据库的驱动程序来对 数据库进行操作,以便使我们再程序中,可以调用驱动程序来完成 我们需要完成的工作。处理 ADO访问技术之外,还有 ODB(开放式 数据库互联)等。3.3程序注释/*利用 ADC 访问 MS SQL2000 要求:【1】输出 Stu_Info 表内的每一条记录【2】添加一条新记录【3】删除名字为 李立 的记录*/#import c:Program FilesCommon FilesSystemADOmsado15.dll/导入动态链接库,使我们可以 为了防止命名冲突,使用 ADC 编程 no_namespace rename(EOF,EndOfF
19、ile)/不使用命名空间#include /标准输入输出流#include /for setw()using namespace std;class STU/定义学生类 public:char snum10;/学号 char sname10;/姓名 char ssex2;/姓别 long sage;/年龄 char smajor20;/专业 public:STU()STU();int main()STU student;/定义学生对象:Colnitialize(NULL);/初始化 OLE/COM 库环境,为访问 ADO接 口做准备 _RecordsetPtr m_pRecordset(ADO
20、DB.Recordset);/建立 记 录集 _ConnectionPtr m_pConnection(ADODB.Connection);/建立 连接 _bstr_t bstrSQL(select*from stu_info);/查询语句 char*query_cmd=DELETE FROM stu_info WHERE sname=李立;try/异常处理 /创建 Connection 对象 m_pConnection.Createlnstance(ADODB.Connection);/设置连接字符串,必须是 BSTR 型或者_bstr_t 类型 _bstr_t strConnect=Pro
21、vider=SQLOLEDB;Server=(local);Database=student;uid=sa;pwd=123;/若数据库在网络上则 Server 为形如/用户 sa 和密码 123 只是针对我的库 m_pConnection-Open(strConnect,adModeUnknown);if(m_pConnection=NULL)cerrOpen(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);_variant_t vsnum,vsname,vsage,vssex,
22、vsmajor;/对应库中的 snum,sname,sage,ssex,smajor cout 学号 姓名 年龄 姓别 专业;cout EndOfFile)/如果记录集没有到记录的 尾端 vsnum m_pRecordset-GetCollect(_variant_t(long)0);/这儿给字段编号和字段名都 可以 vsname=m_pRecordset-GetCollect(sname);vsage=m_pRecordset-GetCollect(sage);vssex=m_pRecordset-GetCollect(ssex);vsmajor=m_pRecordset-GetCollec
23、t(smajor);if(vsnum.vt!=VT_NULL&vsname.vt!vsage.vt!vssex.vt!vsmajor.vt!=VT_NULL)/如 果不为空 cout.setf(ios:left);/设置左对齐 cout setw(14)(char*)(_bstr_t)vsnum;/输出 学号 cout setw(14)(char*)(_bstr_t)vsname;/输 出姓名 cout setw(8)vsage.lVal;/输出年龄 性别 cout setw(20)(char*)(_bstr_t)vsmajor;/出专业 cout.unsetf(ios:/取消左对齐 cout
24、 MoveNext();/移到下一条记录 cout n n;/输入将要插入的信息 cout n 请输入你要添加的学生信息 n;cout student.snum;cout student.sname;cout student.sage;cout student.ssex;cout student.smajor;m_pRecordset-MoveFirst();/移动到第一条记录 m_pRecordset-AddNew();/添加新记录 m_pRecordset-PutCollect(snum,_variant_t(student.snum);/将数据添加 进去输入库 m_pRecordset-
25、PutCollect(sname,_variant_t(student.sname);m_pRecordset-PutCollect(sage,_variant_t(student.sage);m_pRecordset-PutCollect(ssex,_variant_t(student.ssex);m_pRecordset-PutCollect(smajor,_variant_t(student.smajor);m_pRecordset-Update();/更新操作,如果不更新,对数据 库的操作将没有得到相应的操作 m_pConnection-Execute(query_cmd,NULL,1
26、);/用 Execute 执行 sql 语句来删除 m_pRecordset-Close();/关闭记录集 /捕捉异常 catch(_com_error e)/显示错误信息 cerr nERROR:State)m_pConnection-Close();:CoUninitialize();4.实习总结、体会与收获实习总结、体会与收获 通过这些天老师给我们讲授实习课,我知道的我们专业的实 用性,以及在软件工程上我们应该怎么学,学些什么,光靠课堂上 我们学习的东西十分有限,要充分利用课余时间,利用图书馆和互 联网。学习这个专业,要求我们要深入进去,不能只学会些皮毛,要不断跟进时代的步伐,不断学习新的知识,开拓视野,才能在这 个专业上有更好的作为,使我们走得更远,这门课程的学习使我受益 匪浅,为以后的学习打下了基础,激发了我的学习兴趣,使我明确 了自己的专业方向。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1