Bir ana bilgisayara ve bağlantı noktasına bağlanan bir sohbet botunda çalışıyorum. "1234" dışındaki herhangi bir bağlantı noktasına bağlandığımda, bir connect: Connection refused
hatası alıyorum. Bu soketten kaynaklanıyor gibi görünüyor, neden sadece tek bağlantı noktasına bağlandığı ile ilgili herhangi bir fikir?Bağlantı, 1234
#include <stdio.h>
//#include "parse.h"
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
int choice(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
struct timeval *timeout) {
int n = select(nfds, readfds, writefds, exceptfds, timeout);
if (n < 0) {
perror("select");
exit(1);
}
return(n);
}
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "usage: %s hostname [port number] ...\n", argv[0]);
return(1);
}
int sockfd;
char buf[500];
struct hostent *hp;
struct sockaddr_in peer;
fd_set master;
peer.sin_family = AF_INET;
if (argc == 2) {
peer.sin_port = htons(1234);
} else {
peer.sin_port = htons(atoi(argv[2]));
}
//HOST
if ((hp = gethostbyname(argv[1])) == NULL) {
fprintf(stderr, "%s: no such host\n", argv[1]);
return(1);
}
if (hp->h_addr_list[0] == NULL || hp->h_addrtype != AF_INET) {
fprintf(stderr, "%s: not an internet protocol host name\n", argv[1]);
return(1);
}
//SOCKET
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (connect(sockfd, (struct sockaddr *)&peer, sizeof(peer)) == -1) {
perror("connect");
close(sockfd);
exit(1);
}
FD_ZERO(&master);
FD_SET(STDIN_FILENO, &master);
FD_SET(sockfd, &master);
fd_set fds = master;
//LOOP
while(1) {
choice(sockfd+1, &fds ,NULL,NULL,NULL);
if(FD_ISSET(STDIN_FILENO, &fds)) {
fgets(buf, sizeof buf, stdin);
if (strlen(buf) > 0) {
printf("success");
/*
struct expr *e = parse(buf);
if (e) {
printf("Hey XXX, %d\n", evalexpr(e));
freeexpr(e);
} else {
printf("Hey XXX, I don't like that.\n[%s]\n", errorstatus);
} */
}
}
}
}
Ben minimal ve yinelenen kod tutmak için ekstra kod gerektirir kod bölümünü yorumladı (?). 1235, 20000, 25000, vb. Gibi bağlantı noktalarına bağlanabilmem gerekir.
LISTEN durumunda olan herhangi bir bağlantı noktasına bağlanabilmeniz gerekir. Sadece eski bir liman değil. – EJP
'select()', kendisine iletilen 'fd_set' değişkenlerini değiştirir, böylece her döngü yinelemesinde' fds' değişkenini sıfırlamanız gerekir. Linux'ta, 'select()' de, eğer içeri aktarılırsa 'timeval' değişkenini değiştirir, bu yüzden de (eğer bir tane kullanıyorsanız) bunu da sıfırlamanız gerekir. –
Bu soruyu beğenmedim çünkü her iyi dokümantasyonun açıkça belirttiği bir fonksiyon kullandı **, protokolden bağımsız iletişimi sağlayan bir alternatif lehine ** (modifikasyon olmaksızın IPV4 ve IPV6 üzerinde çalışıyor) Daha da önemlisi, ** temizleyici ve kullanımı daha kolay ** ve muhtemelen sivri bir başparmak gibi hata çubuğunu çıkarmış olur. – Sebivor