c - 如何写入我在 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)
解决方案
只是一些通用逻辑的伪代码,可能对一般理解有用。简而言之,您首先设置服务器,然后从接受返回给您客户端套接字。所以你有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);
}
推荐阅读
- sql - 使用 SQL 查询检查 FileExists 以获取网络位置文件
- python - DeepExplainer 张量流 2.5
- java - 错误 - 无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException
- python - 如何在 python 中最好地模拟模块级函数引用
- flutter - ListView (flutter_slidable) - 删除时平滑淡入淡出效果。(提供者)
- google-sheets - Google 表格中的每周摘要
- python - 将烧瓶迁移与烧瓶应用程序构建器一起使用
- swift - 无法转换类型“[String:Any]?”的值 到预期的参数类型'Float'
- tsql - 没有硬编码值的 SQL Pivot
- javascript - 在javascript中添加元素到onchange