1.现在要设计一个基于TCP的通信程序,客户端发送短消息给服务器,服务器回复此消息给客户端。请给出服务器端和客户端各自的设计流程,实现1对1的短消息发送(某需要提供函数名,参数和返回值可以不提供)
时间: 2024-05-07 15:20:31 浏览: 87
服务器端设计流程:
1. 创建套接字,设置套接字选项,绑定本地IP地址和端口号。
2. 监听套接字,等待客户端连接请求。
3. 接受客户端连接请求,创建新的套接字,获取客户端IP地址和端口号。
4. 接收客户端发送的短消息,保存并打印该消息。
5. 将该消息回复给客户端。
6. 关闭套接字,释放资源。
服务器端代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_MSG_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 6666
int main(int argc, char *argv[]) {
int listen_fd, conn_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t client_addr_len;
char buf[MAX_MSG_SIZE];
// 创建套接字
listen_fd = socket(AF_INET, SOCK_STREAM, 0);
if (listen_fd < 0) {
perror("socket error");
exit(EXIT_FAILURE);
}
// 设置套接字选项
int optval = 1;
if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
perror("setsockopt error");
exit(EXIT_FAILURE);
}
// 绑定本地IP地址和端口号
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(SERVER_PORT);
if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("bind error");
exit(EXIT_FAILURE);
}
// 监听套接字,等待客户端连接请求
if (listen(listen_fd, 5) < 0) {
perror("listen error");
exit(EXIT_FAILURE);
}
while (1) {
// 接受客户端连接请求,创建新的套接字
client_addr_len = sizeof(client_addr);
conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &client_addr_len);
if (conn_fd < 0) {
perror("accept error");
exit(EXIT_FAILURE);
}
// 获取客户端IP地址和端口号
char client_ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, sizeof(client_ip));
printf("Connected with client %s:%d\n", client_ip, ntohs(client_addr.sin_port));
// 接收客户端发送的短消息
memset(buf, 0, sizeof(buf));
if (recv(conn_fd, buf, sizeof(buf), 0) < 0) {
perror("recv error");
exit(EXIT_FAILURE);
}
printf("Received message from client: %s\n", buf);
// 将该消息回复给客户端
if (send(conn_fd, buf, strlen(buf), 0) < 0) {
perror("send error");
exit(EXIT_FAILURE);
}
// 关闭套接字,释放资源
close(conn_fd);
}
close(listen_fd);
return 0;
}
```
客户端设计流程:
1. 创建套接字,设置套接字选项,连接服务器IP地址和端口号。
2. 输入要发送的短消息,发送该消息给服务器。
3. 接收服务器回复的消息,打印该消息。
4. 关闭套接字,释放资源。
客户端代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define MAX_MSG_SIZE 1024
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 6666
int main(int argc, char *argv[]) {
int conn_fd;
struct sockaddr_in server_addr;
char buf[MAX_MSG_SIZE];
// 创建套接字
conn_fd = socket(AF_INET, SOCK_STREAM, 0);
if (conn_fd < 0) {
perror("socket error");
exit(EXIT_FAILURE);
}
// 设置套接字选项
int optval = 1;
if (setsockopt(conn_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) {
perror("setsockopt error");
exit(EXIT_FAILURE);
}
// 连接服务器IP地址和端口号
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_IP);
server_addr.sin_port = htons(SERVER_PORT);
if (connect(conn_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connect error");
exit(EXIT_FAILURE);
}
// 输入要发送的短消息,发送该消息给服务器
printf("Please input message to send: ");
fgets(buf, sizeof(buf), stdin);
if (send(conn_fd, buf, strlen(buf), 0) < 0) {
perror("send error");
exit(EXIT_FAILURE);
}
// 接收服务器回复的消息,打印该消息
memset(buf, 0, sizeof(buf));
if (recv(conn_fd, buf, sizeof(buf), 0) < 0) {
perror("recv error");
exit(EXIT_FAILURE);
}
printf("Received message from server: %s\n", buf);
// 关闭套接字,释放资源
close(conn_fd);
return 0;
}
```
阅读全文