socket实验报告
时间: 2023-06-29 08:08:03 浏览: 49
实验名称:使用socket实现TCP/IP通信
实验目的:通过本次实验,掌握socket编程的基本知识,了解TCP/IP通信的原理和实现方式。
实验环境:Ubuntu 18.04
实验步骤:
1. 编写服务器端程序
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 12345
int main(void)
{
int server_sockfd, client_sockfd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
char buf[1024];
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(server_sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(server_sockfd, 5) == -1) {
perror("listen");
exit(EXIT_FAILURE);
}
printf("server is listening...\n");
client_addr_len = sizeof(client_addr);
if ((client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_addr, &client_addr_len)) == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("client %s is connected\n", inet_ntoa(client_addr.sin_addr));
while (1) {
memset(buf, 0, sizeof(buf));
if (recv(client_sockfd, buf, sizeof(buf), 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("recv data: %s\n", buf);
if (send(client_sockfd, buf, sizeof(buf), 0) == -1) {
perror("send");
exit(EXIT_FAILURE);
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
```
2. 编译服务器端程序
```
$ gcc server.c -o server
```
3. 运行服务器端程序
```
$ ./server
```
4. 编写客户端程序
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 12345
int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in server_addr;
char buf[1024];
if (argc != 2) {
fprintf(stderr, "usage: %s <ip_address>\n", argv[0]);
exit(EXIT_FAILURE);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(PORT);
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("connect");
exit(EXIT_FAILURE);
}
printf("connected to server %s\n", inet_ntoa(server_addr.sin_addr));
while (1) {
printf("input data: ");
fgets(buf, sizeof(buf), stdin);
if (send(sockfd, buf, sizeof(buf), 0) == -1) {
perror("send");
exit(EXIT_FAILURE);
}
memset(buf, 0, sizeof(buf));
if (recv(sockfd, buf, sizeof(buf), 0) == -1) {
perror("recv");
exit(EXIT_FAILURE);
}
printf("recv data: %s\n", buf);
}
close(sockfd);
return 0;
}
```
5. 编译客户端程序
```
$ gcc client.c -o client
```
6. 运行客户端程序
```
$ ./client 127.0.0.1
```
实验结果:
在客户端输入数据后,服务端能够接收到数据并输出,同时将数据原封不动地发送回客户端。客户端接收到服务端发送的数据后,也能够正确输出。说明TCP/IP通信已经成功建立。
实验总结:
本次实验通过socket编程,实现了TCP/IP通信。socket编程是网络编程的基础,掌握socket编程的基本知识对于理解网络编程非常重要。通过本次实验,我不仅深入了解了TCP/IP通信的原理和实现方式,还锻炼了代码编写能力。