为了防止接收消息时阻塞发送消息,故提出主线程发送消息,子线程用来接收消息(接收频次较低),以此来达到收发互不影响
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define SERVER_IP "127.0.0.1"
#define SERVER_PORT 8080
#define BUFFER_SIZE 1024
void *receive_thread(void *arg) {
int sockfd = *(int *)arg;
char buffer[BUFFER_SIZE];
ssize_t bytes_read;
while (1) {
bytes_read = recv(sockfd, buffer, BUFFER_SIZE - 1, 0);
if (bytes_read > 0) {
buffer[bytes_read] = '\0'; // Null-terminate the string
printf("Received: %s\n", buffer);
} else if (bytes_read == 0) {
printf("Server closed the connection\n");
break;
} else {
perror("recv failed");
break;
}
}
close(sockfd);
pthread_exit(NULL);
}
int main() {
int sockfd;
struct sockaddr_in server_addr;
pthread_t receive_tid;
int result;
// Create socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
return EXIT_FAILURE;
}
// Set server address
memset(&server_addr, 0, 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);
// Connect to server
if (connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connection failed");
return EXIT_FAILURE;
}
printf("Connected to server\n");
// Create receive thread
result = pthread_create(&receive_tid, NULL, receive_thread, (void *)&sockfd);
if (result != 0) {
perror("pthread_create failed");
close(sockfd);
return EXIT_FAILURE;
}
// Main thread sending messages
char message[] = "Hello from client!";
while (1) {
send(sockfd, message, strlen(message), 0);
printf("Sent: %s\n", message);
sleep(1); // Send a message every second
}
// Wait for receive thread to finish (this is optional if the main thread will run forever)
pthread_join(receive_tid, NULL);
close(sockfd);
return 0;
}