客户端:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define MSG_TYPE_HELLO 0
#define MSG_TYPE_DATA 1
#define MSG_TYPE_GOODBYE 2
typedef struct {
int type;
int length;
char data[1024];
} CustomMessage;
void send_message(int sockfd, CustomMessage *msg) {
write(sockfd, msg, sizeof(CustomMessage));
}
void receive_message(int sockfd, CustomMessage *msg) {
read(sockfd, msg, sizeof(CustomMessage));
}
int main() {
int sockfd;
struct sockaddr_in servaddr;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(8080);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connection with the server failed");
exit(EXIT_FAILURE);
}
CustomMessage msg;
msg.type = MSG_TYPE_HELLO;
msg.length = strlen("Hello, server!") + 1;
strcpy(msg.data, "Hello, server!");
send_message(sockfd, &msg);
receive_message(sockfd, &msg);
printf("Server: %s\n", msg.data);
msg.type = MSG_TYPE_DATA;
msg.length = strlen("Some data from client!") + 1;
strcpy(msg.data, "Some data from client!");
send_message(sockfd, &msg);
receive_message(sockfd, &msg);
printf("Server: %s\n", msg.data);
msg.type = MSG_TYPE_GOODBYE;
msg.length = strlen("Goodbye, server!") + 1;
strcpy(msg.data, "Goodbye, server!");
send_message(sockfd, &msg);
close(sockfd);
return 0;
}
服务器
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#define MSG_TYPE_HELLO 0
#define MSG_TYPE_DATA 1
#define MSG_TYPE_GOODBYE 2
typedef struct {
int type;
int length;
char data[1024];
} CustomMessage;
void send_message(int sockfd, CustomMessage *msg) {
write(sockfd, msg, sizeof(CustomMessage));
}
void receive_message(int sockfd, CustomMessage *msg) {
read(sockfd, msg, sizeof(CustomMessage));
}
int main() {
int listenfd, connfd;
struct sockaddr_in servaddr, cliaddr;
socklen_t len;
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(8080);
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
perror("bind failed");
exit(EXIT_FAILURE);
}
if (listen(listenfd, 5) == -1) {
perror("listen failed");
exit(EXIT_FAILURE);
}
printf("Server listening on port 8080...\n");
CustomMessage msg;
while (1) {
len = sizeof(cliaddr);
if ((connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &len)) == -1) {
perror("accept failed");
exit(EXIT_FAILURE);
}
printf("Client connected\n");
while (1) {
receive_message(connfd, &msg);
switch (msg.type) {
case MSG_TYPE_HELLO:
printf("Client says: %s\n", msg.data);
strcpy(msg.data, "Hello, client!");
send_message(connfd, &msg);
break;
case MSG_TYPE_DATA:
printf("Client sent some data: %s\n", msg.data);
strcpy(msg.data, "Data received by server!");
send_message(connfd, &msg);
break;
case MSG_TYPE_GOODBYE:
printf("Client says goodbye\n");
strcpy(msg.data, "Goodbye, client!");
send_message(connfd, &msg);
close(connfd);
break;
default:
printf("Unknown message type\n");
break;
}
if (msg.type == MSG_TYPE_GOODBYE) {
break;
}
}
}
return 0;
}