基于socket的简单网络程序设计
1、实验目的与要求:
(1)初步掌握TCP和UDP方式的网络编程模式。
(2)能运用Winsock提供的API函数接口进行网络程序的编写。
2、实验准备和说明:
(1)要求掌握流式和数据报socket的编程模式和实现。
(2)创建本次实验工作文件夹“…\实验\实验4”。
3、实验内容与步骤:
1)工程的创建
在VC6里边新建一个工程,选择:Win32
Console Application,输入工程名。具体方法:启动VC6.0,进入【文件】->【新建】,然后在【新建工程】的对话框中选择:Win32
Console Application,输入一个工程名ntTcpClient及保存路径“…\实验\实验4”,点击【确定】
2)Winsock的初始化
在Windows环境下进行网络程序设计时,所有的Winsock函数都是从ws2_32.dll导出的,我们可以通过#pragma
comment(lib, "ws2_32.lib")语句链接到该库文件。但在使用Winsock函数之前还必须调用WSAStartup函数对库资源进行初始化工作,使用完毕后,在退出程序之前,我们还必须调用WSACleanup函数来释放库资源。
3)新建文件ntTcpClient.cpp
<span style="font-size:18px;">#include <stdio.h> #include <stdlib.h> #include "winsock2.h" //winsock 2.2 library #pragma comment(lib,"ws2_32.lib") #define PORT 8888 #define ADDR "127.0.0.1" int main(int argc, char* argv[]) { WSADATA wsock; SOCKET sconnection; SOCKADDR_IN serAddr; int nRet=0; char buf[100]; //初始化Winsock 2.2 printf("\nInitialising Winsock...\n"); if (WSAStartup(MAKEWORD(2,2),&wsock) != 0) { fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()"); exit(0); } printf("Initialised successfully.\n"); //创建监听Socket printf("\nCreating TCP Socket...\n"); if ((sconnection = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("Creation of socket failed %d\n", WSAGetLastError()); WSACleanup(); return 0; } printf("TCP Socket Created successfully.\n"); //设置OCKADDR_IN地址结构 serAddr.sin_family = AF_INET; serAddr.sin_port = htons(PORT); //serAddr.sin_addr.s_addr = INADDR_ANY; serAddr.sin_addr.s_addr = inet_addr(ADDR); //连接服务端 printf("Connecting to %s:%d...\n", inet_ntoa(serAddr.sin_addr), htons(serAddr.sin_port)); if (connect(sconnection, (SOCKADDR *) &serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connection failed with error %d\n", WSAGetLastError()); closesocket(sconnection); WSACleanup(); return 0; } printf("connection successfully.\n"); printf("Trying to send messages.\n"); //收发处理 for(int i=0;;i++) { memset(buf,0,sizeof(buf)); printf("\nMessage to be sent:"); gets(buf); if ((nRet = send(sconnection, buf, strlen(buf), 0)) == SOCKET_ERROR) { printf("send failed with error %d\n", WSAGetLastError()); closesocket(sconnection); WSACleanup(); return 0; } printf("The data was sent to %s successfully.\n",inet_ntoa(serAddr.sin_addr)); if(strncmp(buf,"exit",sizeof("exit"))==0) break; memset(buf,0,sizeof(buf)); if ((nRet = recv(sconnection, buf, sizeof(buf), 0)) == SOCKET_ERROR) { printf("recv failed with error %d\n", WSAGetLastError()); } printf("The following data was received from %s successfully.\n", inet_ntoa(serAddr.sin_addr)); printf(buf); } printf("Closing the connection.\n"); closesocket(sconnection); WSACleanup(); return 0; } </span>
4)编译运行
5)重建工程ntTcpServer
#include "stdafx.h" #include <stdlib.h> #include "winsock2.h" //winsock 2.2 library #pragma comment(lib,"ws2_32.lib") #define PORT 8888 #define ADDR "127.0.0.1" int main(int argc, char* argv[]) { WSADATA wsock; SOCKET listensocket,newconnection; SOCKADDR_IN serAddr,cliAddr; int cliAddrLen=sizeof(cliAddr); int nRet=0; char buf[100]; //初始化Winsock 2.2 printf("\nInitialising Winsock...\n"); if (WSAStartup(MAKEWORD(2,2),&wsock) != 0) { fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()"); exit(0); } printf("Initialised successfully.\n"); //创建监听Socket printf("\nCreating TCP Socket...\n"); if ((listensocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) { printf("Creation of socket failed %d\n", WSAGetLastError()); WSACleanup(); return 0; } printf("TCP Socket Created successfully.\n"); //设置SOCKADDR_IN地址结构 serAddr.sin_family = AF_INET; serAddr.sin_port = htons(PORT); // serAddr.sin_addr.s_addr = INADDR_ANY; serAddr.sin_addr.s_addr = inet_addr(ADDR); //绑定套接字 if (bind(listensocket, (SOCKADDR *)&serAddr, sizeof(serAddr))== SOCKET_ERROR) { printf("bind failed with error %d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } //监听连接 if (listen(listensocket, 5) == SOCKET_ERROR) { printf("listen failed with error %d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } printf("Waiting for a connection on port %d.\n", PORT); //接受连接 if ((newconnection = accept(listensocket, (SOCKADDR *) &cliAddr, &cliAddrLen)) == INVALID_SOCKET) { printf("accept failed with error %d\n", WSAGetLastError()); closesocket(listensocket); WSACleanup(); return 0; } printf("successfully got a connection from %s:%d.\n", inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port)); //此时可以继续监听新的连接,或者停止监听进行数据收发 closesocket(listensocket); printf("Waiting to receive data...\n"); memset(buf,0,sizeof(buf)); for(int i=0;;i++) { if ((nRet = recv(newconnection, buf, sizeof(buf), 0)) == SOCKET_ERROR) { printf("recv failed with error %d\n", WSAGetLastError()); closesocket(newconnection); WSACleanup(); return 0; } //显示接收到的数据 printf(buf); printf("\n"); //若发现exit,则退出处理循环 if(strncmp(buf,"exit",sizeof("exit"))==0) { printf("exit the receiving loop\n"); break; } if((nRet = send(newconnection,buf,strlen(buf),0)) ==SOCKET_ERROR) { printf("send failed with error %d\n", WSAGetLastError()); } } //关闭已连接套接字 closesocket(newconnection); WSACleanup(); return 0; }
6)编译运行,并尝试nTcpServer与nTcpClient进行通信
7)创建工程nUdpClient与nUdpServer
//nUdpServer代码 #include <stdio.h> #include "winsock2.h" //winsock 2.2 library #pragma comment(lib,"ws2_32.lib") #define PORT 8888 #define ADDR "127.0.0.1" int main(int argc, char* argv[]) { WSADATA wsock; SOCKET sersocket; SOCKADDR_IN serAddr; int serAddrsize=sizeof(serAddr); int nRet=0; char buf[1024]; //初始化Winsock 2.2 printf("\nInitialising Winsock...\n"); if (WSAStartup(MAKEWORD(2,2),&wsock) != 0) { fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()"); exit(0); } printf("Initialised successfully.\n"); //创建socket printf("\nCreating UDP Socket...\n"); if ((sersocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { printf("Creation of socket failed %d\n", WSAGetLastError()); WSACleanup(); return 0; } printf("UDP Socket Created successfully.\n"); //设置SOCKADDR_IN地址结构 serAddr.sin_family = AF_INET; serAddr.sin_port = htons(PORT); // serAddr.sin_addr.s_addr = INADDR_ANY; serAddr.sin_addr.s_addr = inet_addr(ADDR); //绑定套接字 if (bind(sersocket, (SOCKADDR *)&serAddr, sizeof(serAddr))== SOCKET_ERROR) { printf("bind failed with error %d\n", WSAGetLastError()); closesocket(sersocket); WSACleanup(); return 0; } printf("Waiting to receive data...\n"); for(int i=0;;i++) { if ((nRet = recvfrom(sersocket, buf, sizeof(buf), 0, (SOCKADDR *)&serAddr, &serAddrsize)) == SOCKET_ERROR) { printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError()); closesocket(sersocket); WSACleanup(); return 0; } //显示接收到的数据 printf(buf); printf("\n"); if ((nRet = sendto(sersocket, buf, strlen(buf), 0, (SOCKADDR *)&serAddr, sizeof(serAddr))) == SOCKET_ERROR) { printf("ERROR: sendto failed with error %d\n", WSAGetLastError()); closesocket(sersocket); WSACleanup(); return 0; } //若发现”exit”,则退出处理循环 if(strncmp(buf,"exit",sizeof("exit"))==0) { printf("exit the receiving loop\n"); break; } } //关闭套接字 closesocket(sersocket); WSACleanup(); return 0; }
//nUdpClient代码 #include <stdio.h> #include "winsock2.h" //winsock 2.2 library #pragma comment(lib,"ws2_32.lib") #define PORT 8888 #define ADDR "127.0.0.1" int main(int argc, char* argv[]) { WSADATA wsock; SOCKET clisocket; SOCKADDR_IN serAddr; int serAddrsize=sizeof(serAddr); int nRet=0; char buf[1024]; //初始化Winsock 2.2 printf("\nInitialising Winsock...\n"); if (WSAStartup(MAKEWORD(2,2),&wsock) != 0) { fprintf(stderr,"WSAStartup() failed %d\n, WSAGetLastError()"); exit(0); } printf("Initialised successfully.\n"); //创建socket printf("\nCreating UDP Socket...\n"); if ((clisocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET) { printf("Creation of socket failed %d\n", WSAGetLastError()); WSACleanup(); return 0; } //设置SOCKADDR_IN地址结构 serAddr.sin_family = AF_INET; serAddr.sin_port = htons(PORT); // serAddr.sin_addr.s_addr = INADDR_ANY; serAddr.sin_addr.s_addr = inet_addr(ADDR); printf("UDP Socket Created successfully.\n"); printf("Trying to send messages.\n"); for(int i=0;;i++) { memset(buf,0,sizeof(buf)); printf("\nMessage to be sent:"); gets(buf); if ((nRet = sendto(clisocket, buf,strlen(buf), 0, (SOCKADDR *)&serAddr, sizeof(serAddr))) == SOCKET_ERROR) { printf("ERROR: sendto failed with error %d\n", WSAGetLastError()); closesocket(clisocket); WSACleanup(); return 0; } printf("The data was sent to %s successfully.\n",inet_ntoa(serAddr.sin_addr)); if(strncmp(buf,"exit",sizeof("exit"))==0) break; memset(buf,0,sizeof(buf)); if ((nRet = recvfrom(clisocket, buf, sizeof(buf), 0, (SOCKADDR *)&serAddr, &serAddrsize)) == SOCKET_ERROR) { printf("ERROR: recvfrom failed with error %d\n", WSAGetLastError()); closesocket(clisocket); WSACleanup(); return 0; } //显示接收到的数据 printf("The following data was received from %s successfully.\n", inet_ntoa(serAddr.sin_addr)); printf(buf); } closesocket(clisocket); WSACleanup(); return 0; }
8)编译运行nUdpClient与nUdpServer,并尝试在它们之间进行通信
基于socket的简单网络程序设计
时间: 2024-10-07 07:06:54