我已经创建了非常基本的客户端和服务器程序,它们使用Unix域套接字从服务器发送消息,消息由客户端捕获
我收到的问题是,我无法捕获从客户端的服务器发送的所有消息
这是我的服务器端代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <time.h>
#include <sys/time.h>
#define NAME "uds_socket"
#define DATA "Test Message"
char buf[1024];
int createAndBindSocket() {
int server_socket;
struct sockaddr_un server_address;
unlink(NAME);
server_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
else printf("Socket creation successful\n");
int reuse = 1;
if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) perror("Error : ");
else printf("Socket options set\n");
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, NAME);
if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {
perror("Binding failed");
close(server_socket);
exit(EXIT_FAILURE);
}
else {
printf("Socket binding successful with name %s\n", server_address.sun_path);
}
if (listen(server_socket, 5) == -1) {
perror("Listening failed");
close(server_socket);
exit(EXIT_FAILURE);
}
else printf("Listening ...\n");
return server_socket;
}
int handleClientRequest(int server_socket) {
int client_socket;
client_socket = accept(server_socket, 0, 0);
if(client_socket == -1) {
perror("Accepting failed");
close(server_socket);
exit(EXIT_FAILURE);
}
else {
printf("Connected to client\n");
}
return client_socket;
}
void sendMessage(int client_socket) {
char* buf = malloc(12);
for(int i=0; i<5; i++) {
snprintf(buf, 12, "Hello %d", i);
if (send(client_socket, buf, sizeof(buf), 0) < 0) {
perror("writing on stream socket");
break;
}
else {
printf("Sending message ...\n");
}
}
}
int main(int argc, char* argv[]) {
int server_socket = createAndBindSocket();
while(1) {
int client_socket = handleClientRequest(server_socket);
sendMessage(client_socket);
close(client_socket);
}
unlink(NAME);
close(server_socket);
return 0;
}
这是我的客户端代码
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#define DATA "Test Message"
char buf[1024];
int main(int argc, char* argv[]) {
int client_socket;
struct sockaddr_un server_address;
char buf[1024];
client_socket = socket(AF_UNIX, SOCK_STREAM, 0);
if (client_socket == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
server_address.sun_family = AF_UNIX;
strcpy(server_address.sun_path, argv[1]);
if (connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Connection failed");
close(client_socket);
exit(EXIT_FAILURE);
}
else {
printf("Fetching message ...\n");
int rval;
while(1) {
rval = recv(client_socket, buf, sizeof(buf), 0);
if(rval < 0) {
perror("Error reading message\n");
break;
}
else if(rval == 0) {
printf("Ending connection\n");
break;
}
else {
printf("%s\n", buf);
}
}
}
close(client_socket);
}
我希望客户端的输出类似于
Fetching message ...
Hello 0
Hello 1
Hello 2
Hello 3
Hello 4
Ending connection
但每次我运行这些程序时,客户端的输出都不同.也就是说,我有时确实会得到想要的输出,但通常会得到这样的结果
Fetching message ...
Hello 0
Hello 1
Hello 3
Hello 4
Ending connection
其中一些消息丢失了.为什么会这样?如何解决?