我有一个简单的tcp客户端服务器程序。客户端发送文本,服务器在ito终端上打印文本。我需要这样做,以便客户端可以通过IP地址连接到服务器,而不仅仅是端口(我现在在localhost上拥有它)。我怎样才能做到这一点?尝试了很多事情,每次都会出错。
这是客户端代码:
int client(char * add) //add is an address passed, either hostname (for ex. google.com)
{ //or just a normal dotted ip (1.2.3.4)
int s, t, len;
struct sockaddr_un remote;
char str[100];
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
printf("Trying to connect...\n");
remote.sun_family = AF_UNIX;
strcpy(remote.sun_path, SOCK_PATH);
len = strlen(remote.sun_path) + sizeof(remote.sun_family);
if (connect(s, (struct sockaddr *)&remote, len) == -1) {
perror("connect");
exit(1);
}
printf("Connected.\n");
int i=0;
while(fgets(str, 100, stdin)) {
if (send(s, str, strlen(str), 0) == -1) {
perror("send");
exit(1);
}
}
close(s);
return 0;
}
而Tere是服务器:
int server(void)
{
int s, s2, t, len;
int z;
struct sockaddr_un local, remote;
char str[100];
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
local.sun_family = AF_UNIX;
strcpy(local.sun_path, SOCK_PATH);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(s, (struct sockaddr *)&local, len) == -1) {
perror("bind");
exit(1);
}
if (listen(s, 5) == -1) {
perror("listen");
exit(1);
}
for(;;) {
int done, n;
t = sizeof(remote);
if ((s2 = accept(s, (struct sockaddr *) &remote, (socklen_t *) &t)) == -1) {
perror("accept");
exit(1);
}
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;
}
我可以使用IP地址将客户端连接到该服务器吗?
我的驱动程序功能选择是否要启动服务器或客户端,它们全部集中在一个文件中。
要启动服务器,我使用:
./main.o -l [port]
并启动一个我想使用的客户端:
./main.o [address] [port]
我真的不知道如何转换地址,然后用它来连接。我的意思是,我已经尝试过gethostbyname(),但是后来我不知道该地址放在哪里,因为sockaddr_un没有地址字段可填充。