socket实验报告
时间: 2023-06-29 15:08:12 浏览: 51
实验目的:
通过使用socket编程实现客户端与服务器之间的通信,了解socket编程的基本原理和实现方法。
实验环境:
操作系统:Windows 10
开发工具:Visual Studio 2019
实验步骤:
1.创建服务器端
首先,我们需要创建一个服务器端程序,在Visual Studio中,我们可以选择创建一个新的控制台应用程序,命名为Server。
然后,我们需要引入Winsock库,包含头文件winsock2.h,代码如下:
```
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
```
接下来,我们需要初始化Winsock库,代码如下:
```
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
```
然后,我们需要创建一个套接字,代码如下:
```
SOCKET ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
```
接着,我们需要设置服务器端的地址和端口,代码如下:
```
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(27015);
```
接下来,我们需要将套接字绑定到服务器端地址和端口上,代码如下:
```
if (bind(ListenSocket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("bind failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
```
然后,我们需要监听客户端的连接请求,代码如下:
```
if (listen(ListenSocket, SOMAXCONN) == SOCKET_ERROR) {
printf("listen failed with error: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
```
最后,我们需要接受客户端的连接请求,并且和客户端进行通信,代码如下:
```
SOCKET ClientSocket = INVALID_SOCKET;
ClientSocket = accept(ListenSocket, NULL, NULL);
if (ClientSocket == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
}
char recvbuf[512];
int iResult;
do {
iResult = recv(ClientSocket, recvbuf, sizeof(recvbuf), 0);
if (iResult > 0) {
printf("Bytes received: %d\n", iResult);
printf("Message received: %s\n", recvbuf);
send(ClientSocket, recvbuf, iResult, 0);
}
else if (iResult == 0) {
printf("Connection closing...\n");
}
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ClientSocket);
WSACleanup();
return 1;
}
} while (iResult > 0);
```
2.创建客户端
接下来,我们需要创建一个客户端程序,在Visual Studio中,我们可以选择创建一个新的控制台应用程序,命名为Client。
同样,我们需要引入Winsock库,包含头文件winsock2.h,代码如下:
```
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
```
接着,我们需要初始化Winsock库,代码如下:
```
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (iResult != 0) {
printf("WSAStartup failed: %d\n", iResult);
return 1;
}
```
然后,我们需要创建一个套接字,代码如下:
```
SOCKET ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
```
接下来,我们需要设置服务器端的地址和端口,代码如下:
```
sockaddr_in server;
server.sin_family = AF_INET;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_port = htons(27015);
```
然后,我们需要连接服务器端,代码如下:
```
if (connect(ConnectSocket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("connect failed with error: %ld\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
```
最后,我们需要向服务器端发送消息,并且接收服务器端的回复,代码如下:
```
char sendbuf[512] = "Hello, server!";
int iResult = send(ConnectSocket, sendbuf, sizeof(sendbuf), 0);
if (iResult == SOCKET_ERROR) {
printf("send failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
printf("Bytes sent: %d\n", iResult);
char recvbuf[512];
iResult = recv(ConnectSocket, recvbuf, sizeof(recvbuf), 0);
if (iResult > 0) {
printf("Bytes received: %d\n", iResult);
printf("Message received: %s\n", recvbuf);
}
else if (iResult == 0) {
printf("Connection closing...\n");
}
else {
printf("recv failed with error: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
WSACleanup();
return 1;
}
```
实验结果:
在Server程序中,我们可以看到服务器端已经成功地监听客户端的连接请求,并且和客户端进行了通信。
在Client程序中,我们可以看到客户端已经成功地连接到服务器端,并且向服务器端发送了消息,并且接收到了服务器端的回复。
实验总结:
通过本次实验,我们学习了socket编程的基本原理和实现方法,掌握了如何使用socket编程实现客户端与服务器之间的通信。同时,我们也了解了Winsock库的使用方法,包括如何引入库文件,如何初始化库,如何创建套接字,如何设置地址和端口,如何监听连接请求,如何接受连接请求,如何发送和接收消息等等。