Отправка / получение C UDP-пакетов происходит автоматически (SVR 3.2 с TLI) - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь написать сервер и клиент UDP на AT & T UNIX SVR 3.2, используя сетевой API TLI.Сервер работает так, как показывает на netstat -a -n с локальным интерфейсом 127.0.0.1:4000.Когда я отправляю данные пользователя из другой программы с t_sndudata(), код ошибки не возвращается, но пакет не появляется из прослушивателя.Кто-нибудь может определить ошибку кодирования, ответственную за эту проблему?

listen.c

#include <stdio.h>
#include <fcntl.h>
#include <tiuser.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/in.h>
#include <netdb.h>

main() {
        int fd;
        int flags;

        struct t_bind *bind;
        struct t_unitdata *ud;
        struct t_uderr *uderr;
        char *addr;
        struct sockaddr_in myaddr;

        extern int t_errno;

        if ((fd = t_open("/dev/udp", O_RDWR, NULL)) < 0) {
                t_error("unable to open UDP provider");
                exit(1);
        }

        if ((bind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR)) == NULL) {
                t_error("t_alloc of t_bind structure failed");
                exit(2);
        }

        memset((void *)&myaddr, 0, sizeof(struct sockaddr_in));
        myaddr.sin_family = AF_INET;
        myaddr.sin_addr.s_addr = htonl(0x7f000001);
        myaddr.sin_port = htons(4000);
        memcpy(bind->addr.buf, &myaddr, sizeof(struct sockaddr_in));

        bind->qlen = 1;
        bind->addr.len = sizeof(struct sockaddr_in);

        if (t_bind(fd, bind, bind) < 0) {
                t_error("t_bind failed");
                exit(3);
        }

        printf("Listening!\n");

        if ((ud = (struct t_unitdata *)t_alloc(fd, T_UNITDATA, T_ALL)) == NULL) {
                t_error("t_alloc of t_unitdata structure failed");
                exit(5);
        }

        if ((uderr = (struct t_uderr *)t_alloc(fd, T_UDERROR, T_ALL)) == NULL) {
                t_error("t_alloc of t_uderr structure failed");
                exit(6);
        }

        while (1) {
                if (t_rcvudata(fd, ud, &flags) < 0) {
                        char buffer[256];
                        strncpy(buffer, ud->udata.buf, ud->udata.len);
                        printf("Receive: %s\n", buffer);
                }
                printf("Loop");
        }

}

send.c

#include <stdio.h>
#include <fcntl.h>
#include <tiuser.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/in.h>
#include <netdb.h>

main(argc, argv)
int argc;
char **argv;
{
        int fd;
        int flags;

        struct t_bind *bind;
        struct t_unitdata *ud;
        struct t_uderr *uderr;
        char *addr;
        struct sockaddr_in myaddr;
        struct sockaddr_in srvaddr;

        extern int t_errno;

        if ((fd = t_open("/dev/udp", O_RDWR, NULL)) < 0) {
                t_error("unable to open UDP provider");
                exit(1);
        }

        if ((bind = (struct t_bind *)t_alloc(fd, T_BIND, T_ADDR)) == NULL) {
                t_error("t_alloc of t_bind structure failed");
                exit(2);
        }

        memset((void *)&myaddr, 0, sizeof(struct sockaddr_in));
        myaddr.sin_family = AF_INET;
        myaddr.sin_addr.s_addr = htonl(0x7f000001);
        myaddr.sin_port = htons(4001);
        memcpy(bind->addr.buf, &myaddr, sizeof(struct sockaddr_in));

        bind->qlen = 0;
        bind->addr.len = sizeof(struct sockaddr_in);

        if (t_bind(fd, bind, bind) < 0) {
                t_error("t_bind failed");
                exit(3);
        }

        printf("Sending: %s\n", argv[1]);

        if ((ud = (struct t_unitdata *)t_alloc(fd, T_UNITDATA, T_ALL)) == NULL) {
                t_error("t_alloc of t_unitdata structure failed");
                exit(5);
        }

        memset((void *)&srvaddr, 0, sizeof(struct sockaddr_in));
        srvaddr.sin_family = AF_INET;
        srvaddr.sin_addr.s_addr = htonl(0x7f000001);
        srvaddr.sin_port = htons(4000);
        memcpy(ud->addr.buf, &srvaddr, sizeof(struct sockaddr_in));
        ud->addr.len = sizeof(struct sockaddr_in);
        printf("The udata buf can hold %d bytes\n", ud->udata.maxlen);
        strcpy(ud->udata.buf, argv[1]);
        ud->udata.len = strlen(argv[1]);
        printf("I have set up %d bytes and it contains %s\n", ud->udata.len, ud->udata.buf);
        ud->opt.len = 0;

        printf("Calling t_sndudata()...\n");
        if (t_sndudata(fd, ud) < 0) {
                t_error("t_sndudata failed");
                exit(9);
        }
        printf("Finished\n");
}

Выход слушателя

$ ./listen
Listening!

netstat

$ netstat -a -n | grep 4000
udp        0      0  127.0.0.1.4000         *.*

Выход отправителя

$ ./send fish
Sending: fish
The udata buf can hold 65535 bytes
I have set up 4 bytes and it contains fish
Calling t_sndudata()...
Finished
...