2

我正在用 C 中的套接字做一些实验,但我有一个问题,我认为有一个解决方案,但我想不通!

我有一个用 C 编写的服务器和一个客户端,它们在本地网络中运行良好,我尝试了'localhost'127.0.0.1或只是192.168.1.2,一切都像一个魅力...... 但是当我尝试连接到远程主机(对于我的实验,我使用我自己的计算机,在http://www.whatismyip.com/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);
     }
}

这是我的 client.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;
}
4

2 回答 2

4

这段代码至少有一个问题:

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

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

于 2012-07-13T06:37:09.937 回答
0

正如评论中的某些人已经说过的那样,可能是您的路由器或任何为您提供服务的东西来跨越边界192.168.*62.98.XXX.XX阻止访问。原因很清楚——它不知道应该连接它后面的哪台 PC(如果有的话)。

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

在 3G 上,它可能无法正常工作,因为大多数移动提供商都会提供该范围内的 IPv4 地址10.0.0.0/8

或者,正如我们同时拥有 2012 年一样,您可以设置 IPv6 环境并修改您的程序以使其能够使用它。

于 2012-07-13T07:32:59.827 回答