我有一个Unix域套接字服务器。在我的服务器应用程序中,我创建了一个线程。在这个线程中,我创建了一个unix服务器套接字。另外,我创建了一个轮询fd来检查套接字上的任何活动。所以,在套接字上可以有两个活动 - 第一个是连接接受,一旦连接被接受,我需要监视该连接。在我的例子中,我假设只有一个套接字客户端。我的问题是,当客户端应用程序尝试连接时,我从来没有在连接的套接字上获得事件。但是,我的客户端应用程序说连接。这是我的服务器程序和客户端程序。我在这里错过了什么?我感到困惑。是否有任何额外的设置/参数要做。 虽然我觉得逻辑是正确的。是否有任何额外的参数或设置需要通过在C,Linux中通过轮询fd来获取unix套接字连接?
服务器应用
#define WEBSOCK_PATH_NAME "/tmp/websock"
int createServerSocket(void)
{
struct sockaddr_un saddr;
char buf[128];
int sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
{
printf("failed to create UN socket, errno=%d\n", errno);
return -1;
}
memset(&saddr, 0, sizeof(saddr));
saddr.sun_family = AF_UNIX;
strncpy(saddr.sun_path, WEBSOCK_PATH_NAME, sizeof(saddr.sun_path));
if (bind(sock, (struct sockaddr *)&saddr, sizeof(saddr)) < 0) {
strerror_r(errno, buf, sizeof(buf));
printf("failed to bind address %s errno=%d: %s\n",
WEBSOCK_PATH_NAME, errno, buf);
close(sock);
return -1;
}
if (listen(sock, 2) != 0) {
strerror_r(errno, buf, sizeof(buf));
printf("listen failed for %s errno=%d: %s\n",
WEBSOCK_PATH_NAME, errno, buf);
close(sock);
perror("listen failed: ");
return -1;
}
printf("Created WebIntStat Server\n");
return sock;
}
void Thread()
{
int websock;
struct pollfd fds[2];
nfds_t numfds;
websock = CreateServerSocket();
if(websock == -1)
{
printf("Failed in creating socket");
return;
}
// make it usable by everyone
memset(fds, 0, sizeof(fds));
chmod(WEBSOCK_PATH_NAME, 0777);
numfds = 1; // presently monitor 1 fd
fds[0].fd = webSock;
fds[0].events = POLLIN;
fds[0].revents = 0;
while(1)
{
// Want to run this and check the data every 1 second to do other stuffs
int events = poll(fds, numfds, 1000);
if(events > 0)
{
// I get this print
printf("Got some events");
if (fds[0].revents & POLLIN)
{
// I never get this one ------
printf("Got Connection Request..accept it");
//socket accept code.
}
}
}
}
客户端代码
#define SOCKET_PATH "/tmp/websock"
int main()
{
int sockfd;
int len;
struct sockaddr_un address;
int result;
char ch[5] = "Start";
/* -AF_UNIX is a UNIX internal socket, created on the filesystem.
* -SOCK_STREAM is a reliable, sequenced, connection-based two-way byte stream
* (INET equivalent is TCP) */
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
/* -sun_family - specifies type (domain) of socket
* -sun_path - socket path location (on filesystem) */
address.sun_family = AF_UNIX;
strcpy(address.sun_path, SOCKET_PATH);
len = sizeof(address);
/* request connection from the server, connecting socket to server with specified address
* 'len' is the length of the address */
result = connect(sockfd, (struct sockaddr *)&address, len);
/* exit with error if connection is not successful */
if(result == -1) {
perror("oops: client1");
exit(1);
}
printf("Connected");
/* otherwise write data to server and obtain response */
write(sockfd, ch, 5);
read(sockfd, &ch, 5);
printf("char from server: %s\n", ch);
close(sockfd);
exit(0);
}
这是所有嵌入式应用程序中运行,所以我没有太多的插座工具来检查我的忙箱。
对不起,在发布问题时,unix域套接字路径名是个问题。 –