1
我正在尝试创建一个套接字,它与两个分叉了的子进程进行通信,a和b。我需要它通过套接字sc进行通信。作为一个起点,我试图让Process a通过sc套接字向Process b写入消息,但到目前为止,我尝试过的所有内容都会导致打印出错信息。c - 分叉进程与套接字通信
以下是我的代码。任何想法如何最终使其工作? (我的最终目标是阅读和写作多条消息,因此对此的任何建议都是一个明确的奖励。)预先感谢您提供的任何帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main() {
pid_t a, b;
int sc;
struct sockaddr server = {AF_UNIX, "server"};
sc = socket(AF_UNIX, SOCK_STREAM, 0);
bind(sc, &server, sizeof(server));
listen(sc, 1);
if ((a = fork()) == 0) {
struct sockaddr me = {AF_UNIX, "ProcessA"};
struct sockaddr there = server;
int s = socket(AF_UNIX, SOCK_STREAM, 0);
char buffer[256];
sprintf(buffer, "test");
if (bind(s, &me, sizeof(me)) < 0) {printf("Error binding\n"); exit(1);}
if (connect(s, &there, sizeof(there)) < 0) printf("Error connecting\n");
write(s, buffer, strlen(buffer) + 1);
printf("Process A\n");
exit(0);
}
else if ((b = fork()) == 0) {
struct sockaddr address;
int length;
length = sizeof(address);
int c, n;
char buffer[256];
if ((c = accept(sc, &address, &length)) < 0) {printf("Error accepting\n"); exit(1);}
if ((n = read(c, buffer, 255)) < 0) {printf("Error reading\n"); exit(1);}
printf("Log Process\n");
printf("%s\n", buffer);
exit(0);
}
return 0;
}
我不断收到消息“错误绑定”和“错误接受” - 再次,谢谢。
你是否检查'fork'成功之前是否对'socket','bind'和'listen'进行初始调用?我认为你应该使用'struct sockaddr_un',而不是'struct sockaddr'。如果你无法正常工作,是否考虑过使用'pipe'或'socketpair'而不是设置unix域套接字? – user3553031
好的错误消息将有所帮助。而不是'printf(“错误接受”)',尝试'perror(“接受”)'。对于您的所有错误消息也是如此。 –
我添加了perror函数,并在第一个绑定中获得以下内容:协议族不支持的地址族 - 我是否需要更改AF_UNIX上的任何sockaddr的属性,或者是其他问题? (我确实设法用管道做到这一点,现在我正在使用套接字) – user1567060