我正在尝试制作一个支持3个套接字的server.c文件,这些套接字由3个相应的客户端类表示:client1,client2,client3。
在我的server.c文件中,我当前拥有在互联网上找到的这段代码。
如果我想使其具有3个插槽。我想使用select()命令查看3个客户端的写入活动。我的问题是如何使用它来支持3个插槽。
我可以将3个客户端绑定到服务器可以收听的3个套接字吗?如果是这样,服务器如何分别监听这三个套接字?用数组可能吗?
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#define socket1 "sock1"
#define socket2 "sock2"
#define socket3 "sock3"
int main(int argc, char *argv[]) {
//struct sockaddr_un addr;
struct sockaddr_un addr1;
struct sockaddr_un addr2;
struct sockaddr_un addr3;
char buf[100];
int socket1;
int socket2;
int socket3;
//int fd;
int cl,rc;
if (argc > 1) socket_path=argv[1];
if ( (socket1 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(-1);
}
memset(&addr1, 0, sizeof(addr1));
addr1.sun_family = AF_UNIX;
strncpy(addr1.sun_path, socket_path, sizeof(addr1.sun_path)-1);
unlink(socket_path1);
if ( (socket2 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(-1);
}
memset(&addr2, 0, sizeof(addr2));
addr1.sun_family = AF_UNIX;
strncpy(addr2.sun_path, socket_path, sizeof(addr2.sun_path)-1);
unlink(socket_path2);
if ( (socket3 = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(-1);
}
memset(&addr3, 0, sizeof(addr3));
addr3.sun_family = AF_UNIX;
strncpy(addr3.sun_path, socket_path, sizeof(addr3.sun_path)-1);
unlink(socket_path3);
if (bind(socket1, (struct sockaddr*)&addr1, sizeof(addr1)) == -1) {
perror("bind error");
exit(-1);
}
if (bind(socket2, (struct sockaddr*)&addr2, sizeof(addr2)) == -1) {
perror("bind error");
exit(-1);
}
if (bind(socket3, (struct sockaddr*)&addr3, sizeof(addr3)) == -1) {
perror("bind error");
exit(-1);
}
if (listen(socket1, 5) == -1) {
perror("listen error");
exit(-1);
}
if (listen(socket2, 5) == -1) {
perror("listen error");
exit(-1);
}
if (listen(socket3, 5) == -1) {
perror("listen error");
exit(-1);
}
while (1) {
if ( (cl = accept(fd, NULL, NULL)) == -1) {
perror("accept error");
continue;
}
while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
printf("read %u bytes: %.*s\n", rc, rc, buf);
}
if (rc == -1) {
perror("read");
exit(-1);
}
else if (rc == 0) {
printf("EOF\n");
close(cl);
}
}
return 0;
}
如果要在同一过程中使用三个侦听套接字,则必须使它们唯一。在AF_INET
家庭中,您可以通过对bind(2)
不同的端口进行操作,在AF_UNIX
家庭中,您可以通过不同的路径进行操作。
还有你的行:
char *socket_path = "\0hidden";
至少有两个问题:
const char[8]
,它会衰减为const char*
指针类型,而不是char*
类型。使左手边const char*
。另外,请以更高的警告级别进行编译,例如-Wall -pedantic
从编译器获取帮助。strncpy(3)
copies at most n characters from the string pointed to by src, including the terminating null byte ('\0')
创建一个函数,该函数将UNIX路径作为参数,并创建,绑定套接字并将其标记为侦听,并返回创建的套接字描述符。调用它三遍-您有三个侦听UNIX套接字。设置select(2)
它们以进行阅读-会在客户端连接到达时告诉您。此时,调用accept(2)
活动套接字以获取已连接的客户端套接字,该客户端套接字与侦听套接字本身是独立的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句