计算机网络协议仿真实验
(LPSOCKADDR)&saServer, // 服务员地址 sizeof(struct sockaddr) //地址长度 );
/*错误处理*/
if (nRet == SOCKET_ERROR) {
PRINTERROR(\ closesocket(theSocket); return; }
/* 等待来自客户端的数据*/
SOCKADDR_IN saClient; char szBuf[1024]; int nLen;
while(1) {
/*准备接收数据*/
memset(szBuf, 0, sizeof(szBuf)); nRet = recvfrom(theSocket, szBuf, sizeof(szBuf), 0,
// 已绑定的socket // 接收缓冲区 // 缓冲区大小 // Flags
(LPSOCKADDR)&saClient, // 接收客户端地址的缓冲区 &nLen); // 地址缓冲区的长度
/*打印接收到的信息*/
printf(\
/* 发送数据给客户端*/
strcpy(szBuf, \
sendto(theSocket,
// 已绑定的socket
计算机网络协议仿真实验
szBuf, strlen(szBuf), 0, // 发送缓冲区
// 发送数据的长度 // Flags
(LPSOCKADDR)&saClient, // 目的地址 nLen); // 地址长度 }
closesocket(theSocket);
return; }
//////////////////////////////////////////////////////////// //数据报服务员端主程序 //
////////////////////////////////////////////////////////////
void main() {
WORD wVersionRequested = MAKEWORD(1,1); WSADATA wsaData; int nRet; short nPort;
nPort = SERV_UDP_PORT;
/* 初始化Winsock*/
nRet = WSAStartup(wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) {
fprintf(stderr,\ return; }
/*调用数据服务员子程序*/ DatagramServer(nPort);
/*结束WinSock*/
计算机网络协议仿真实验
WSACleanup(); }
请学生认真阅读分析上述服务员程序,然后根据实验原理二中介绍的内容,自行编写相应的无连接的客户端程序并运行。从而实现客户和服务器间的数据传输。 。
在仿真机一端运行客户端进程,在监控机端捕获数据并进行分析。
练习二:使用TCP协议的面向连接的客户-服务员程序设计。
根据实验原理中介绍的内容,设计一个面向连接的客户-服务员系统,实现二者之间的数据传递。
下面是一个简单的TCP客户-服务员程序的服务员程序: 面向连接的服务员程序:
#include
#define SERV_TCP_PORT 6000 /*服务员进程端口号,视具体情况而定*/ #define SERV_HOST_ADDR \服务员IP,视具体情况而定*/ int sockfd;
/////////////////////////////////////////////////////////////// //线程用来处理客户端的请求 // //服务员主进程每与某客户端建立一个连接之后,便启动一个新的线程来处理接下// //客户端的请求,参数为服务员与该客户端的连接点:socket // //////////////////////////////////////////////////////////////
DWORD ClientThread(void *pVoid) {
int nRet;
char szBuf[1024];
memset(szBuf, 0, sizeof(szBuf));
计算机网络协议仿真实验
/*接收来自客户端的数据信息*/
nRet = recv((SOCKET )pVoid, szBuf, sizeof(szBuf), 0);
//与客户端连接的socket // 接收缓冲区 // 缓冲区长度 // Flags
/*错误处理*/
if (nRet == INVALID_SOCKET) {
printf(\ closesocket(sockfd);
closesocket((SOCKET)pVoid); return 0; }
/*显示接收到的数据*/
printf(\
/* 发送数据给客户端*/
strcpy(szBuf, \发送内容 nRet = send((SOCKET)pVoid, //与客户端连接的socket szBuf, // 数据缓冲区 strlen(szBuf), // 数据长度 0); // Flags
/*结束连接,释放socket*/
closesocket((SOCKET)pVoid);
return 0; }
////////////////////////////////////////////////////////////// //服务员主程序: // //在一个众所周知的端口上等待客户的连接请求 // //有请求到来时建立与客户端的连接,并启动一个线程处理该请求 //
//////////////////////////////////////////////////////////////
int main()
计算机网络协议仿真实验
{
int clilen; int pHandle=-1;
struct sockaddr_in serv_addr; SOCKET socketClient; DWORD ThreadAddr; HANDLE dwClientThread; SOCKADDR_IN SockAddr;
/*初始化Winsock API,即连接Winsock库*/
WORD wVersionRequested = MAKEWORD(1, 1); WSADATA wsaData;
if (WSAStartup(wVersionRequested, &wsaData)) {
printf(\ return -1; }
/*打开一个TCP SOCKET */
if((sockfd=socket(AF_INET, SOCK_STREAM,0))<0) printf(\
/*绑定本地地址,以便客户端连接*/
memset((char *)&serv_addr,0,sizeof(struct sockaddr_in)); serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(SERV_TCP_PORT);
if (bind(sockfd,(struct sockaddr *)(& serv_addr), sizeof (serv_addr) )<0)
printf(\
/*设置服务员的最大连接数为15*/ listen(sockfd,5);
/*循环等待来自客户端的连接请求*/ while(1) {
/*阻塞等待一个请求的到来*/