我有一个简单的tcp客户端服务器程序。客户端发送文本,服务器在ito终端上打印文本。我需要这样做,以便客户端可以通过IP地址(而不仅仅是端口)连接到服务器。试图更改我的本地主机服务器中的某些内容,但它只破坏了它,并且不再起作用。里面有什么?
这是服务器代码:
int server(int port)
{
int fd;
struct ifreq ifr;
char * addres;
fd = socket(AF_INET, SOCK_STREAM, 0);
/* I want to get an IPv4 IP address */
ifr.ifr_addr.sa_family = AF_INET;
/* I want IP address attached to "eth0" */
strncpy(ifr.ifr_name, "em0", IFNAMSIZ-1);
ioctl(fd, SIOCGIFADDR, &ifr);
close(fd);
addres=inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
//until this part, i'm getting my em0 address to a variable which I want to use later
//to specify on which address I want my server to be
int s, s2, t, len;
int z;
struct sockaddr_in local, remote;
char str[100];
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sin_family = AF_INET;
local.sin_addr.s_addr = inet_addr(addres); //inet_addr(inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr));
printf("binder");
if (bind(s, (struct sockaddr *)&local, sizeof(local)) == -1) {
perror("bind");
exit(1);
}
if (listen(s, 5) == -1) {
perror("listen");
exit(1);
}
for(;;) {
int done, n;
printf("Waiting for a connection...\n");
t = sizeof(remote);
if ((s2 = accept(s, (struct sockaddr *) &remote, (socklen_t *) &t)) == -1) {
perror("accept");
exit(1);
}
printf("Connected...\n");
done = 0;
do {
n = recv(s2, str, 100, 0);
if (n <= 0) {
if (n < 0) perror("recv");
done = 1;
}
if (!done)
printf("%s", str);
fflush(stdout);
sleep(1);
} while (!done);
close(s2);
}
return 0;
}
它应该在给定的端口和em0接口地址上开始侦听,但似乎什么也没做。在驱动程序函数中,我只是传递要使用的int表示端口。
我可以使用IP地址将客户端连接到该服务器吗?
我的驱动程序功能选择是否要启动服务器或客户端,它们全部集中在一个文件中。
要启动服务器,我使用:
./main.o -l [port]
并启动一个我想使用的客户端:
./main.o [address] [port]
客户端似乎工作正常,只是拒绝连接,唯一的问题(据我所知)是服务器。也许您会发现我在做什么错,我和它在一起坐了几个小时,基本上没有希望。