gpt4 book ai didi

c - 如何使用unix套接字(AF_UNIX、SOCK_DGRAM)模拟PUB/SUB?

转载 作者:行者123 更新时间:2023-11-30 14:57:36 29 4
gpt4 key购买 nike

我正在努力让这种简单的沟通发挥作用。

我用 zmq 不到五分钟就搞定了。使用 UNIX 套接字来做这件事很痛苦(显然是因为我缺乏信心)。

这是服务器:

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "streamsocket.h"

char *socket_path = "/tmp/stream";
int socket_fd=0;
struct sockaddr_un addr;

int main(){
socket_setup();
while(1){
socket_sendstr("a");
sleep(1);
}
}

void socket_setup(){

int rc;

memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strcpy(addr.sun_path, socket_path);

if ( (socket_fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
perror("socket error");
exit(-1);
}

rc=bind(socket_fd, (struct sockaddr *) &addr, sizeof(addr));
if(rc<0){
perror("bind error");
exit(-2);
}

}

int socket_sendstr(char* buffer) {
int len=strlen(buffer);
// corrected after suggestion in answer below (rc->len)
// int rc=write(socket_fd, buffer, rc);
int rc=write(socket_fd, buffer, len);

if (rc != len) {
if (rc > 0) fprintf(stderr,"partial write");
else {
perror("write error");
//exit(-1);
}
}
}

这是客户端:

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
char * server_filename = "/tmp/stream";
char * client_filename = "/tmp/stream-client";

struct sockaddr_un server_addr;
struct sockaddr_un client_addr;

int rc;

memset(&server_addr, 0, sizeof(server_addr));
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, server_filename, 104);

memset(&client_addr, 0, sizeof(client_addr));
client_addr.sun_family = AF_UNIX;
strncpy(client_addr.sun_path, client_filename, 104);

// get socket
int sockfd = socket(AF_UNIX, SOCK_DGRAM, 0);

// bind client to client_filename
rc = bind(sockfd, (struct sockaddr *) &client_addr, sizeof(client_addr));
if(rc==-1) perror("bind error");

// connect client to server_filename
rc = connect(sockfd, (struct sockaddr *) &server_addr, sizeof(server_addr));
if(rc==-1) perror("connect error");


char buf[1024];
int bytes=0;
while(bytes = read(sockfd, buf, sizeof(buf))){
printf("%s\n",buf);
}

close(sockfd);
}

我做错了什么?

目前客户端没有打印任何内容。

EDIT1:将服务器 write( , ,rc) 中错误的“rc”纠正为 write( , ,len)

编辑2:由于客户端无法工作,因此: socat UNIX-CLIENT:/tmp/stream -

所以我认为问题可能出在服务器上。

最佳答案

int len=strlen(buffer);
int rc=write(socket_fd, buffer, rc);

期望获得第三个参数长度;

关于c - 如何使用unix套接字(AF_UNIX、SOCK_DGRAM)模拟PUB/SUB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834734/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com