TCP/IP 网络套接字编程
实验目的及要求:
掌握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()
tcpip协议是internet最基本的协议{
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--本机
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论