如何仅使用其IP连接到服务器?

时间:2015-01-10 23:12:37

标签: c sockets

我是插座的新手。所以我设置了一个服务器,我想通过互联网连接客户端。我不明白我做错了什么,因为以下示例适用于环回地址(127.0.0.1),但是当其他人尝试使用我的外部IP地址连接到我的服务器时却没有。是不是那么简单,还是我在代码中做错了什么?

修改 :(当客户端到达connect()时出现connect: Connection timed out错误时,客户端会被卡住)

Edit2 :我尝试在服务器代码中使用广播地址inet_addr("192.168.1.255")代替INADDR_ANY。没有变化。

这是我的服务器代码:

#include <stdio.h>
#include <stdlib.h\
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(void) {

    int temp;
    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;
    int sin_size;
    int numbytes;
    char buf[100];
    int sock_fd; // server file descriptor
    int new_fd; // client file descriptor

    sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock_fd == -1) { perror("socket"); exit(1); }

    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(9000);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero), 8);

    temp = bind(sock_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
    if (temp == -1) { perror("bind"); exit(1); }

    temp = listen(sock_fd, 5);
    if (temp == -1) { perror("listen"); exit(1); }

    printf("\nListening for new connections on port %d ...\n\n", 9000);

    while (1) {
        sin_size = sizeof(struct sockaddr_in);
        new_fd = accept(sock_fd, (struct sockaddr*)&their_addr, &sin_size);
        if (new_fd == -1) { perror("accept"); continue; }
        printf("Got connection from IP (%s)\n", inet_ntoa(their_addr.sin_addr));
        close(new_fd);
    }
}

这是我的客户代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

int main(int argc, char *argv[]) {

    int temp;
    struct hostent *host_info;
    struct sockaddr_in serv_addr;
    char ip_addr[100];
    int numbytes;
    char buf[100];
    int sock_fd;

    inet_pton(AF_INET, argv[5], &serv_addr.sin_addr);
    host_info = gethostbyaddr(&serv_addr.sin_addr, sizeof serv_addr.sin_addr, AF_INET);
    if (host_info == NULL) { herror("gethostbyname"); exit(1); }

    printf("\nServer: '%s' (IP: %s , Port: %d)\n\n", argv[1], inet_ntop(AF_INET, host_info->h_addr, ip_addr, 100), 9000);

    sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock_fd == -1) { perror("socket"); exit(1); }

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(9000);
    serv_addr.sin_addr = *((struct in_addr *)host_info->h_addr);
    bzero(&(serv_addr.sin_zero), 8);

    temp = connect(sock_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr));
    if (temp == -1) { perror("connect"); exit(1); }

    close(sock_fd);
    exit(0);
}

3 个答案:

答案 0 :(得分:1)

在这里发布答案,以便接受我的整体解决方案。问题是我没有在路由器上转发@AdamRosenfield指示的端口,然后在我这样做之后我将服务器的地址更改为:

my_addr.sin_addr.s_addr = inet_addr("192.168.1.2");

根据ifconfig(我正在使用Ubuntu) MY 本地IP地址。 现在我唯一的问题是,除了我自己的电脑以外,其他任何人都可以连接到我的服务器,但根据@nos,这可能是我的路由器特有的问题。

如果有人对如何解决这个问题有答案请更新我(我尝试使用环回地址连接客户端,我的外部IP,我的本地IP等等,没有任何工作)。

答案 1 :(得分:0)

client.c应如下所示

int main(int argc, char *argv[]){

int temp;
struct hostent *host_info;
struct sockaddr_in serv_addr;
char ip_addr[100];
int numbytes;
char buf[100];
int sock_fd;

unsigned long inaddr;

//inet_pton(AF_INET, argv[5], &serv_addr.sin_addr);
//host_info = gethostbyaddr(&serv_addr.sin_addr, sizeof serv_addr.sin_addr, AF_INET);
//if (host_info == NULL) { herror("gethostbyname"); exit(1); }

printf("\nServer: '%s' (IP: %s , Port: %d)\n\n", argv[0], argv[1], 9000);

inaddr = inet_addr(argv[1]);

sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if (sock_fd == -1) { perror("socket"); exit(1); }

serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(9000);
memcpy(&serv_addr.sin_addr, &inaddr, sizeof(inaddr));
//bzero(&(serv_addr.sin_zero), 8);

temp = connect(sock_fd, (struct sockaddr*)&serv_addr, sizeof(struct sockaddr));
if (temp == -1) { perror("connect"); exit(1); }

close(sock_fd);
exit(0);

}

然后使用g ++编译它:g ++ client.c -o client。

像这样使用客户端:./ client yourserverIP

答案 2 :(得分:-1)

在客户端代码中设置服务器地址时,您可以这样做:

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");//your server's ip address