【发布时间】:2017-10-12 06:14:59
【问题描述】:
我有一个 Unix 域套接字服务器。在我的服务器应用程序中,我创建了一个线程。在这个线程中,我创建了一个 unix 服务器套接字。另外,我创建了一个 poll fd 来检查套接字上的任何活动。因此,套接字上可以有两个活动 - 首先是连接接受,一旦连接被接受,我需要监视该连接。在我的示例中,我假设只有 1 个套接字客户端。我的问题是,当客户端应用程序尝试连接时,我从未在套接字上获得连接事件。但是,我的客户端应用程序说已连接。这是我的服务器程序和客户端程序。我在这里想念什么?我很困惑。是否有任何额外的设置/参数要做。 不过我觉得逻辑是对的。
服务器应用
#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);
}
这一切都在嵌入式应用程序中运行,所以我没有太多的套接字实用程序来检查我忙碌的盒子。
【问题讨论】: