Skip to content

Commit 5fdc4df

Browse files
committed
Add testing files for connect EINPROGRESS error
1 parent 176ea22 commit 5fdc4df

File tree

8 files changed

+196
-0
lines changed

8 files changed

+196
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
server
2+
client
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
CC = gcc
2+
CFLAGS = -Wall -Wextra
3+
4+
all: server client
5+
6+
server: server.c
7+
$(CC) $(CFLAGS) -o server server.c
8+
9+
client: client.c
10+
$(CC) $(CFLAGS) -o client client.c
11+
12+
.PHONY: clean
13+
14+
clean:
15+
rm -f server client
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <sys/types.h>
4+
#include <sys/socket.h>
5+
#include <netinet/in.h>
6+
#include <unistd.h>
7+
#include <errno.h>
8+
#include <string.h>
9+
#include <arpa/inet.h>
10+
#include <sys/poll.h>
11+
#include <fcntl.h>
12+
13+
int main() {
14+
// Create socket
15+
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
16+
if (sockfd == -1) {
17+
perror("socket");
18+
exit(EXIT_FAILURE);
19+
}
20+
21+
// Set server address and port
22+
struct sockaddr_in server_addr;
23+
server_addr.sin_family = AF_INET;
24+
server_addr.sin_port = htons(8089); // Port number
25+
inet_aton("127.0.0.1", &server_addr.sin_addr); // IP address of the server
26+
27+
// Set socket to non-blocking
28+
if (fcntl(sockfd, F_SETFL, O_NONBLOCK) < 0) {
29+
perror("fcntl");
30+
close(sockfd);
31+
exit(EXIT_FAILURE);
32+
}
33+
34+
// Connect to server
35+
int result = connect(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));
36+
if (result == -1 && errno == EINPROGRESS) {
37+
printf("Connection in progress (EINPROGRESS).\n");
38+
39+
// Wait for connection using poll
40+
struct pollfd fds[1];
41+
fds[0].fd = sockfd;
42+
fds[0].events = POLLOUT;
43+
44+
int poll_result = poll(fds, 1, 10000); // 10-second timeout
45+
if (poll_result == -1) {
46+
perror("poll");
47+
close(sockfd);
48+
exit(EXIT_FAILURE);
49+
} else if (poll_result == 0) {
50+
printf("Connection timeout.\n");
51+
close(sockfd);
52+
exit(EXIT_FAILURE);
53+
} else {
54+
// Connection established or error occurred
55+
if (fds[0].revents & POLLOUT) {
56+
int error = 0;
57+
socklen_t len = sizeof(error);
58+
if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0) {
59+
perror("getsockopt");
60+
close(sockfd);
61+
exit(EXIT_FAILURE);
62+
}
63+
if (error != 0) {
64+
fprintf(stderr, "Error in connecting: %s\n", strerror(error));
65+
close(sockfd);
66+
exit(EXIT_FAILURE);
67+
}
68+
printf("Connection established %d : %d.\n", errno, error);
69+
} else {
70+
fprintf(stderr, "Unknown error occurred.\n");
71+
close(sockfd);
72+
exit(EXIT_FAILURE);
73+
}
74+
}
75+
} else if (result == 0) {
76+
if (errno == EINPROGRESS) {
77+
printf("Connection in progress.\n");
78+
} else {
79+
printf("Connection established.\n");
80+
}
81+
} else {
82+
perror("connect");
83+
exit(EXIT_FAILURE);
84+
}
85+
86+
close(sockfd);
87+
return 0;
88+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?php
2+
3+
4+
$connection = stream_socket_client("tcp://127.0.0.1:8087", $errno, $errstr, 60, STREAM_CLIENT_CONNECT);
5+
6+
var_dump($connection, $errno, $errstr);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
2+
sudo iptables -t mangle -D OUTPUT -p tcp --dport 8087 -j MARK --set-mark 123
3+
sudo tc filter del dev lo protocol ip parent 1:0 prio 1
4+
sudo tc qdisc del dev lo parent 1:1 handle 10:
5+
sudo tc qdisc del dev lo root handle 1:
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
sudo iptables -t mangle -A OUTPUT -p tcp --dport 8087 -j MARK --set-mark 123
2+
sudo tc qdisc add dev lo root handle 1: prio
3+
sudo tc qdisc add dev lo parent 1:1 handle 10: netem delay 2s
4+
sudo tc filter add dev lo protocol ip parent 1:0 prio 1 u32 match mark 123 0xffff flowid 1:1
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
#include <sys/types.h>
4+
#include <sys/socket.h>
5+
#include <netinet/in.h>
6+
#include <unistd.h>
7+
#include <errno.h>
8+
#include <string.h>
9+
#include <arpa/inet.h>
10+
#include <fcntl.h>
11+
12+
int main() {
13+
// Create socket
14+
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
15+
if (server_fd == -1) {
16+
perror("socket");
17+
exit(EXIT_FAILURE);
18+
}
19+
20+
// Set server address and port
21+
struct sockaddr_in server_addr;
22+
server_addr.sin_family = AF_INET;
23+
server_addr.sin_port = htons(8089); // Port number
24+
server_addr.sin_addr.s_addr = INADDR_ANY;
25+
26+
// Bind socket to address and port
27+
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
28+
perror("bind");
29+
close(server_fd);
30+
exit(EXIT_FAILURE);
31+
}
32+
33+
// Listen for incoming connections
34+
if (listen(server_fd, 3) == -1) {
35+
perror("listen");
36+
close(server_fd);
37+
exit(EXIT_FAILURE);
38+
}
39+
40+
printf("Server listening on port 8089...\n");
41+
42+
// Simulate delay before accepting connections
43+
printf("Simulating delay before accepting connections...\n");
44+
sleep(20); // 10-second delay
45+
46+
// // Accept incoming connection
47+
// struct sockaddr_in client_addr;
48+
// socklen_t addrlen = sizeof(client_addr);
49+
// int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addrlen);
50+
// if (client_fd == -1) {
51+
// perror("accept");
52+
// close(server_fd);
53+
// exit(EXIT_FAILURE);
54+
// }
55+
56+
// printf("Connection accepted from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
57+
58+
// close(client_fd);
59+
close(server_fd);
60+
return 0;
61+
}
62+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
$server = stream_socket_server('127.0.0.1:8087');
4+
5+
$read = [$server];
6+
$write = $except = null;
7+
8+
9+
stream_select($read, $write, $except, 10);
10+
sleep(10);
11+
echo "ready to accept\n";
12+
$conn = stream_socket_accept($server);
13+
14+
var_dump($conn);

0 commit comments

Comments
 (0)