Ребят, покритикуйте код. Посоветуйте, что можно сделать? На десятках соединений код работает. На тысяче все встает раком.
Суть в том, что первая запущенная программа должна успеть создать сокет, а остальные копии программы к нему уже подключаются. Но, видимо, копии запускаются быстрее, чем создается сокет и начинается гонка.
const gchar *tdir = g_get_tmp_dir (); //tmp dir
const gchar *uname = g_get_user_name (); //user name
sock_name = g_strconcat (tdir,"/japw-",uname,NULL);
s_id = socket (AF_UNIX,SOCK_STREAM,0);
gint s_status;
struct sockaddr_un addr;
g_stpcpy (addr.sun_path, sock_name);
addr.sun_family = AF_UNIX;
s_status = bind (s_id,(struct sockaddr *) &addr, sizeof(addr));
gint s_c_status;
if (s_status == -1) {
gint i = 0;
do {
s_c_status = connect (s_id,(struct sockaddr *) &addr, sizeof(addr));
++i;
} while (s_c_status == -1 && i < 1500);
if (s_c_status != -1) {
create_listf (fcount, flist);
if (max_count_image == 0) exit (EXIT_SUCCESS);
gchar *buf;
buf = g_strjoinv ("|", fnames);
channel = g_io_channel_unix_new (s_id);
gsize bw,lw;
lw = strlen (buf) +1;
g_io_channel_write (channel, buf, lw, &bw);
g_io_channel_shutdown (channel, TRUE, NULL);
close (s_id);
g_free (buf);
exit (EXIT_SUCCESS);
}
else {
(void) unlink (sock_name);
s_status = bind (s_id,(struct sockaddr *) &addr, sizeof(addr));
if (s_status == -1) {
g_printf ("Error: create socket");
exit (EXIT_FAILURE);
}
}
}
listen (s_id, 5);
channel = g_io_channel_unix_new (s_id);
s_watch = g_io_add_watch (channel, G_IO_IN, (GIOFunc) accept_files, NULL);