C中的套接字到远程主机

C中的套接字到远程主机,c,sockets,host,C,Sockets,Host,我正在用C中的套接字做一些实验,但我有一个问题,我认为有一个解决方案,但我无法解决它 我有一个用C编写的服务器和一个客户机,它们在本地网络中运行得非常好,我尝试了“localhost”和127.0.0.1或192.168.1.2,一切都很好。。。 但是当我尝试连接到远程主机时(在我的实验中,我使用了我自己的计算机,在62.98.XXX.XX上找到了IP),连接和数据(字符串)交换从未发生过 我如何解决这个问题 这是我的server.c代码 //server #include <s

我正在用C中的套接字做一些实验,但我有一个问题,我认为有一个解决方案,但我无法解决它

我有一个用C编写的服务器和一个客户机,它们在本地网络中运行得非常好,我尝试了“localhost”和127.0.0.1或192.168.1.2,一切都很好。。。 但是当我尝试连接到远程主机时(在我的实验中,我使用了我自己的计算机,在62.98.XXX.XX上找到了IP),连接和数据(字符串)交换从未发生过

我如何解决这个问题

这是我的server.c代码

    //server

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

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0;
    struct sockaddr_in serv_addr; 

    char sendBuff[1025];
    time_t ticks; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000); 

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); 

    listen(listenfd, 10); 

    while(1)
    {
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL); 

        ticks = time(NULL);
        snprintf(sendBuff, sizeof(sendBuff), "%.24s\r\n", ctime(&ticks));
        write(connfd, sendBuff, strlen(sendBuff)); 

        close(connfd);
        sleep(1);
     }
}
//服务器
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int listenfd=0,connfd=0;
服务地址中的结构sockaddr\u;
char sendBuff[1025];
时间滴答;
listenfd=套接字(AF_INET,SOCK_STREAM,0);
memset(&serv_addr,'0',sizeof(serv_addr));
memset(sendBuff,'0',sizeof(sendBuff));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
serv_addr.sin_port=htons(5000);
绑定(listenfd,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
听(listenfd,10);
而(1)
{
connfd=accept(listenfd,(struct sockaddr*)NULL,NULL);
刻度=时间(空);
snprintf(sendBuff,sizeof(sendBuff),“%.24s\r\n”,ctime(&ticks));
写入(connfd、sendBuff、strlen(sendBuff));
关闭(connfd);
睡眠(1);
}
}
这是我的客户机.c代码

//client

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

int main(int argc, char *argv[])
{
    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr; 

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    } 

    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    } 

    memset(&serv_addr, '0', sizeof(serv_addr)); 

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000); 

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
    {
        printf("\n inet_pton error occured\n");
        return 1;
    } 

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
       printf("\n Error : Connect Failed \n");
       return 1;
    } 

    while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
        recvBuff[n] = 0;
        if(fputs(recvBuff, stdout) == EOF)
        {
            printf("\n Error : Fputs error\n");
        }
    } 

    if(n < 0)
    {
        printf("\n Read error \n");
    } 

    return 0;
}
//客户端
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
int sockfd=0,n=0;
char recvBuff[1024];
服务地址中的结构sockaddr\u;
如果(argc!=2)
{
printf(“\n用法:%s\n”,argv[0]);
返回1;
} 
memset(recvBuff,'0',sizeof(recvBuff));
if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
printf(“\n错误:无法创建套接字\n”);
返回1;
} 
memset(&serv_addr,'0',sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(5000);
if(inet\u pton(AF\u inet,argv[1],&serv\u addr.sin\u addr)0)
{
recvBuff[n]=0;
如果(fputs(recvBuff,标准输出)=EOF)
{
printf(“\n错误:Fputs错误\n”);
}
} 
if(n<0)
{
printf(“\n读取错误\n”);
} 
返回0;
}

此代码至少有一个问题:

memset(&serv_addr, '0', sizeof(serv_addr));

是否确实要用0x30填充内存?

此代码至少有一个问题:

memset(&serv_addr, '0', sizeof(serv_addr));

你真的想用0x30来填充内存吗?

正如一些人在评论中所说的,可能是你的路由器或任何服务你的东西跨越了
192.168.*
62.98.XXX.XX.
之间的边界,阻止了访问。原因很清楚——它不知道它背后的哪些PC应该被封装,如果有的话

您必须明确地告诉box(我假设您拥有对它的完全访问权)要转发到哪个内部IP。如果您没有完全访问权限,您将无法执行此操作,因为没有肯定打开的端口

在3G上,它可能不起作用,因为大多数移动提供商提供的IPv4地址范围在
10.0.0.0/8
之内


或者,正如我们在2012年所做的那样,您可以设置一个IPv6环境并修改您的程序以使其能够运行。

正如一些人在评论中所说的,可能是您的路由器或任何服务于您的东西跨越了访问的
192.168.*
62.98.XXX.XX
块之间的边界。原因很清楚——它不知道它背后的哪些PC应该被封装,如果有的话

您必须明确地告诉box(我假设您拥有对它的完全访问权)要转发到哪个内部IP。如果您没有完全访问权限,您将无法执行此操作,因为没有肯定打开的端口

在3G上,它可能不起作用,因为大多数移动提供商提供的IPv4地址范围在
10.0.0.0/8
之内


或者,正如我们在2012年所做的那样,您可以设置一个IPv6环境并修改您的程序以使其能够使用。

端口5000可能被防火墙/natbox阻止?请尝试运行服务器并使用
telnet
访问该端口。这将检查您的连接。对,这几乎肯定是一个网络配置问题,端口被路由器或网络上的其他设备阻塞。此外,如果您在普通电缆/dsl路由器后面,则需要“端口转发”电脑的适当端口。检查路由器配置屏幕-注意,这允许世界上任何人访问该端口!嗯…你认为这是港口问题吗?我可以试试哪个号码,它肯定是开着的?如果我在3G上试用,它会起作用吗?谢谢…可能您的防火墙/natbox阻止了端口5000?请尝试运行服务器并使用
telnet
访问该端口。这将检查您的连接。对,这几乎肯定是一个网络配置问题,端口被路由器或网络上的其他设备阻塞。此外,如果您在普通电缆/dsl路由器后面,则需要“端口转发”电脑的适当端口。检查路由器配置屏幕-注意,这允许世界上任何人访问该端口!嗯…你认为这是港口问题吗?我可以试试哪个号码,它肯定是开着的?如果我在3G上试用,它会起作用吗?谢谢…我不想更改路由器的设置,因为这只是一个实验。。。我的整个项目都将转移到iPhone上,所以我无法控制想要使用什么样的路由器。我需要交换很多字符串(移动坐标的对象),所以我想到了套接字。。。。你能给我推荐一些替代方案吗?@Fabiosoft你可以设置一个中央服务器,让手机连接到一个处理通信内容的服务器。我曾想过用mysql设置一个中央服务器,但我必须交换一个lo