Я пытаюсь написать сервер и клиент 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