首页 > 解决方案 > 如何写入我在 C 中的另一个文件中创建的套接字?

问题描述

我有两个c文件,服务器和客户端。服务器侦听并接受来自客户端的连接请求,然后等待打印出客户端提供给它的消息。连接过程完美运行,但我不知道如何让它中继它应该接收的消息。

由于这两个文件是分开的,我不确定将什么文件描述符放入客户端的 write() 调用中。服务器中的 read() 调用在客户端中的 write() 调用之前调用,它使用文件描述符 s2,它是其 accept() 调用的输出。

如何让我的客户端文件中的 write() 调用与我的服务器文件中的 read() 调用正在寻找的同一个套接字进行通信?

下面的代码有一些功能,比如为了时间的缘故省略了错误检查。

这是我的server.c文件的内容:

int main(int argc, char** argv) {

     char buffer[257];
     int pipe_fds;
     int psts; // Holds result of pipe creation attempt
     psts = my_pipe(pipe_fds);

     if(psts == 0) { // If pipe is successful
             printf(" SERVER: Server running...\n");
             printf(" SERVER: Waiting for message...\n");
             read(pipe_fds, buffer, 257); // <---------- Output stops here
             printf(" SERVER: Message: %s\n", buffer);

             close(pipe_fds);
     }
     return 0;
}

这是上面块中使用的函数my_pipe() :

int my_pipe(int fd) {

// SET UP CONNECTION REQUEST SOCKET: S1 -------------------------------------------
    int s1 = socket(AF_UNIX, SOCK_STREAM, 0);
    if(s1 == -1) {return -1;}

    struct sockaddr name1 = {AF_UNIX, "ServerSocket"};
    socklen_t namelen1 = sizeof(struct sockaddr) + 13;
    bind(s1, &name1, namelen1);

    printf("\n SERVER: [s1] Socket Created! \n");

// SET UP LISTEN/ACCEPT -----------------------------------------------------------
    if(listen(s1, 1) == -1) {return -1;}

    printf("\n SERVER: Server Listening! \n\n");

// SET UP CLIENT CONNECTION SOCKET: S2 --------------------------------------------
    struct sockaddr name1_0;
    socklen_t namelen1_0;

    int s2 = accept(s1, &name1_0, &namelen1_0); // <----------- This is where s2 is defined
    if(s2 == -1) {return -1;}
    printf(" SERVER: Client Found...\n");

    fd = s2;
    close(s1);
    return 0;
}

最后,这是我的client.c文件的内容:

int main(int argc, char** argv) {

    char buffer[257];

    // Create a socket to connect to the server with
    int s0 = socket(AF_UNIX, SOCK_STREAM, 0);
    if(s0 == -1) { return -1; }

    // Create a sockaddr for the known existing socket "ServerSocket"
    struct sockaddr server_name = {AF_UNIX, "ServerSocket"};
    socklen_t server_len = sizeof(struct sockaddr) + 13;

    // Connect to "ServerSocket"
    if(connect(s0, &server_name, server_len) == -1) {return -1;}

    printf("CLIENT: Client Connected!\n");
    strcpy(buffer, "This is the Client Message.");
    write([INSERT SERVER SOCKET FD], buffer, strlen(buffer) + 1); // <----- The line in question

    printf("CLIENT: Message Sent!\n");

    close(s0);
    return 0;
}

运行这两个文件的服务器输出:

 SERVER: [s1] Socket Created!

 SERVER: Server Listening!

 SERVER: Client Found...
 SERVER: Server running...
 SERVER: Waiting for message...
 (infinite waiting)

标签: csocketsmultiple-processes

解决方案


只是一些通用逻辑的伪代码,可能对一般理解有用。简而言之,您首先设置服务器,然后从接受返回给您客户端套接字。所以你有2个不同的插座。您不再需要服务器套接字并关闭服务器套接字,因此它可以接受进一步的连接(一次只能接受一个)。您可以获取客户端套接字并将其传递给函数或 fork() 或将其传递给线程 - 完全由您决定。

     main () {
          int server_socket;
          server_socket = socket(AF_INET, ....);
          init(addrinfo()) // initialize server_socket
          bind //port
          listen // set backlog queue, number of allowed waiting connections)
          while (1) { //loop to wait for incoming connections
              int client_socket = accept(server_socket....) //client connection !
              close(server_socket); // otherwise blocked
              my_pipe(&client_socket) /pass client socket to function
          }

          my_pipe(*socket) {
          read/write //send/recv 
          close(socket);
          }

推荐阅读