ProgrammingProject1 SocketProgramming(WinSocket编程-TCP协议)

更新时间:2023-03-08 09:26:19 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Project 1 Socket Programming

Requirements:

In this project, Studentwill learn the important skill of distributed programming using socket programming. Socket programming is very cool and the basis of the vast majority of Internet programming.

Student will write a TCP or UDPclient and a TCP or UDPserver. Implement a client that retrieves temperature, humidity and light data from a remote server. The client should connect to the server, stay connected, and retrieve a number of readings. The client can request readings from the server as many times as you want.

The server is responsible for accepting client connections and sending out the right data according to the commands sent by clients.

Data returned by the server are like:

TEMPERATURE = 60 HUMIDITY = 0 LIGHT = 1

The background to this programming idea is that a client can interacts with a sensor and gets real-time sensor readings, such as temperature, humidity, and light. Here the “sensor” is the server software.

Codes (TCP): Client Program (TCP) #include #include #include #pragma comment(lib,%using namespace std; int main() {

WORD wVersionRequested; //加载socket动态链接库(dll) WSADATA wsaData; //此结构用于接收Windows Socket的结构信息 int err; wVersionRequested = MAKEWORD(1, 1); //请求1.1版本的WinSock库 err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) //返回值 = 0,表示成功申请了一个WSAStartup return -1; if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { //低字节 =1,高字节 =1才是1.1版本,否则清除信息,结束函数 1 / 7

} WSACleanup(); return -1; //创建socket操作,建立SOCK_STREAM(TCP),返回Socket字号sockClient SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0); //①AF_INET:指定地址簇-TCP只能是AF_INET //②SOCK_STREAM:选择Socket类型(TCP) //③0:默认 //向服务器发出连接请求(connect()) SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr(\本地回路地址 addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(6000); connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); //①sockCli:需要进行连接操作的套接字 //②(SOCKADDR*)&addrSrv:设定所需要连接的地址信息 //③地址长度 char sendBuf[100]; sprintf_s(sendBuf, \send(sockClient, sendBuf, strlen(sendBuf) + 1, 0); char recvBuf[100]; recv(sockClient, recvBuf, 100, 0); printf(\char Crequest[2]; while (true) { memset(Crequest, 0, sizeof(Crequest)); scanf_s(\ getchar(); Crequest[1] = '\\0'; send(sockClient, Crequest, strlen(Crequest)+1, 0); recv(sockClient, recvBuf, 100, 0); printf(\2 / 7

} } closesocket(sockClient); WSACleanup(); // 终止对套接字库的使用 return 0; Server Program (TCP) #include #include #include #include #include #include #pragma comment(lib,%using namespace std; int main() {

WORD wVersionRequested; //加载socket动态链接库(dll) WSADATA wsaData; //此结构用于接收Windows Socket的结构信息 int err; wVersionRequested = MAKEWORD(1, 1); //请求1.1版本的WinSock库 err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) //返回值 = 0,表示成功申请了一个WSAStartup return -1; if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { } //低字节 =1,高字节 =1才是1.1版本,否则清除信息,结束函数 WSACleanup(); return -1; //创建socket操作,建立SOCK_STREAM(TCP),返回Socket字号sockSrv SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0); //①AF_INET:指定地址簇-TCP只能是AF_INET 3 / 7

//②SOCK_STREAM:选择Socket类型(TCP) //③0:默认 //绑定套接字sockSrv到一个IP地址和一个端口上 SOCKADDR_IN addrSrv; //TCP中,使用SOCKADDR_IN代替SOCKADDR addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //套接字的主机IP地址 addrSrv.sin_family = AF_INET; //表示地址族,对于IP地址,sin_family成员将一直是AF_INET addrSrv.sin_port = htons(6000); //指定将要分配给套接字的端口 bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR)); //①sockSrv:指定需要绑定的套接字 //②(SOCKADDR *)&addrSrv:指定该套接字的本地地址信息(强制类型转换) //③sizeof(SOCKADDR):指定该网络协议地址长度 //套接字设置为监听模式(链接请求),listen()通知TCP服务器主备好接收连接 listen(sockSrv, 10); //①sockSrv:指定需要设置的套接字 //②10:等待连接队列的最大长度 SOCKADDR_IN addrClient; int length = sizeof(SOCKADDR); printf(\ while (true)//等待客户端请求 { //请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept()) SOCKET sockConnect = accept(sockSrv, (SOCKADDR*)&addrClient, &length); //①sockSrv:接收一个处于监听状态下的套接字 //②(SOCKADDR*)&addrClient:保存客户端地址信息 //③&length:指定这个地址的长度 //返回值:向这个处于监听状态的套接字通信的套接字 //用返回的套接字和客户端进行通信(send()/recv()) char sendBuf[100]; sprintf_s(sendBuf, \//发送数据 4 / 7

send(sockConnect, sendBuf, strlen(sendBuf) + 1, 0); //①sockConnect:需要发送信息的套接字 //②sendBuf:需要被传输的数据 //③strlen(sendBuf) + 1:buffer的长度 char recvBuf[100]; //接收数据 recv(sockConnect, recvBuf, 100, 0); //①sockConnect:建立连接后的套接字 //②recvBuf:接收数据 //③接收数据的长度 printf(\char Crespond[2]; //FILE *Temperature = fopen(\//FILE *Humidity = fopen(\ //FILE *Light = fopen(\ifstream Temperature (\大四\\\\网络技术\\\\Socket编程\\\\Server\\\\temperature.dat\ifstream Humidity (\大四\\\\网络技术\\\\Socket编程\\\\Server\\\\humidity.dat\ifstream Light (\大四\\\\网络技术\\\\Socket编程\\\\Server\\\\light.dat\int T, H, L; while (true) { memset(Crespond, 0, sizeof(Crespond)); memset(sendBuf, 0, sizeof(sendBuf)); recv(sockConnect, Crespond, 2, 0); if (Crespond[0] != 'R') break; else { Temperature >> T; Humidity >> H; Light >> L; 5 / 7

= %d\\n\ } }

Execute Result:

Client (Enter ‘R’ and get the datum):

} sprintf_s(sendBuf, \HUMIDITY = %d T,H,L); printf(\send(sockConnect, sendBuf, strlen(sendBuf)+1, 0); LIGHT Temperature.close(); Humidity.close(); Light.close(); closesocket(sockConnect); } closesocket(sockSrv); WSACleanup(); return 0;

6 / 7

Server(One Client & Two or more clients):

Conclusion:

This socket communication is dependent on TCP protocol. Network programming is still following create->initialize->communicate->close this sequence.

7 / 7

本文来源:https://www.bwwdw.com/article/jlq3.html

Top