2014-07-08 34 views
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; 
} 

我不断收到消息“错误绑定”和“错误接受” - 再次,谢谢。

+1

你是否检查'fork'成功之前是否对'socket','bind'和'listen'进行初始调用?我认为你应该使用'struct sockaddr_un',而不是'struct sockaddr'。如果你无法正常工作,是否考虑过使用'pipe'或'socketpair'而不是设置unix域套接字? – user3553031

+0

好的错误消息将有所帮助。而不是'printf(“错误接受”)',尝试'perror(“接受”)'。对于您的所有错误消息也是如此。 –

+0

我添加了perror函数,并在第一个绑定中获得以下内容:协议族不支持的地址族 - 我是否需要更改AF_UNIX上的任何sockaddr的属性,或者是其他问题? (我确实设法用管道做到这一点,现在我正在使用套接字) – user1567060

回答

3

Beej's Guide

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <errno.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 

int main(void) 
{ 
    int sv[2]; /* the pair of socket descriptors */ 
    char buf; /* for data exchange between processes */ 

    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) == -1) { 
     perror("socketpair"); 
     exit(1); 
    } 

    if (!fork()) { /* child */ 
     read(sv[1], &buf, 1); 
     printf("child: read '%c'\n", buf); 
     buf = toupper(buf); /* make it uppercase */ 
     write(sv[1], &buf, 1); 
     printf("child: sent '%c'\n", buf); 

    } else { /* parent */ 
     write(sv[0], "b", 1); 
     printf("parent: sent 'b'\n"); 
     read(sv[0], &buf, 1); 
     printf("parent: read '%c'\n", buf); 
     wait(NULL); /* wait for child to die */ 
    } 

    return 0; 
} 

注:考虑关闭你不叉后使用插座:在孩子的情况下close(sv[0]);;在父例中为close(sv[1]);