On Mon, 7 Apr 2025 15:08:32 +0800
Yuyi Wang wrote:
> Below is a simple unix socket testing code. It creates a unix socket server
> and
> a client to connect to it immediately. It works on Linux and macOS, but hangs
> on
> cygwin. bind + listen work well, but seems that the connect method never
> returns.
>
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <unistd.h>
> #include <sys/socket.h>
> #include <sys/un.h>
> #include <errno.h>
>
> #define SOCKET_PATH "/tmp/example_socket"
>
> int main() {
> int server_fd, client_fd;
> struct sockaddr_un server_addr;
> socklen_t client_len;
>
> server_fd = socket(AF_UNIX, SOCK_STREAM, 0);
> if (server_fd == -1) {
> perror("server socket");
> exit(EXIT_FAILURE);
> }
>
> memset(&server_addr, 0, sizeof(server_addr));
> server_addr.sun_family = AF_UNIX;
> strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) -
> 1);
>
> if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr))
> == -1) {
> perror("bind");
> exit(EXIT_FAILURE);
> }
>
> if (listen(server_fd, 1) == -1) {
> perror("listen");
> exit(EXIT_FAILURE);
> }
>
> printf("Server is listening on %s\n", SOCKET_PATH);
>
> client_fd = socket(AF_UNIX, SOCK_STREAM, 0);
> if (client_fd == -1) {
> perror("client socket");
> exit(EXIT_FAILURE);
> }
>
> if (connect(client_fd, (struct sockaddr*)&server_addr,
> sizeof(server_addr)) == -1) {
> perror("connect");
> exit(EXIT_FAILURE);
> }
>
> printf("Client connected to server\n");
>
> close(client_fd);
> close(server_fd);
> unlink(SOCKET_PATH);
>
> return 0;
> }
I guess connect() just is just waiting accept().
--
Takashi Yano <[email protected]>
--
Problem reports: https://cygwin.com/problems.html
FAQ: https://cygwin.com/faq/
Documentation: https://cygwin.com/docs.html
Unsubscribe info: https://cygwin.com/ml/#unsubscribe-simple