2015-05-26 152 views
0

我有一个非常简单的客户端和服务器代码:客户端无法与服务器C连接(Socket编程)

客户

int sockfd = 0; 
    int bytesReceived = 0; 
    char recvBuff[BUFSIZE]; 
    memset(recvBuff, '0', sizeof(recvBuff)); 
    struct sockaddr_in serv_addr; 
    printf("here i am\n"); 
    /* Create a socket first */ 
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0){ 
     printf("\n Error : Could not create socket \n"); 
     return 1; 
    } 
    fprintf(stderr, "connection stats\n"); 
    fprintf(stderr, "connecting to %d - %s \n",port,server); 
    /* Initialize sockaddr_in data structure */ 
    serv_addr.sin_family = AF_INET; 
    serv_addr.sin_port = htons(port); // port 
    serv_addr.sin_addr.s_addr = server; 
    printf(" attempting connection %s:%d\n", server, port); 
    /* Attempt a connection */ 
    int con = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); 
    printf("Error %d\n", con); 
    exit(-1); 

和服务器

int listenfd = 0; 
    int connfd = 0; 
    struct sockaddr_in serv_addr; 
    char sendBuff[BUFSIZE]; 
    int numrv; 

    listenfd = socket(AF_INET, SOCK_STREAM, 0); 

    printf("Socket retrieve success\n"); 

    memset(&serv_addr, '0', sizeof(serv_addr)); 
    memset(sendBuff, '0', sizeof(sendBuff)); 
    printf("here 2\n"); 
    serv_addr.sin_family = AF_INET; 
    printf("here 3\n"); 
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    printf("here 4\n"); 
    serv_addr.sin_port = htons(port); 
    printf("here 5\n"); 
    int optval = 1; 
    printf(" opening port %d\n", port); 
    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, 
       (const void *) &optval, sizeof(int)); 
    bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); 
    printf("binded\n"); 


    while (1) { 
     connfd = accept(listenfd, (struct sockaddr *) NULL, NULL); 
     printf("connfd %d", connfd); 


     close(connfd); 
     sleep(1); 


    } 

客户端输出:

here i am 
connecting to 8888 - localhost 
attempting connection localhost:8888 

服务器输出

Socket retrieve success 
here 2 
here 3 
here 4 
here 5 
opening port 8888 
binded 

,等待像几分钟后..我注意以下事项: 客户:

here i am 
connecting to 8888 - localhost 
attempting connection localhost:8888 
Error -1 

服务器:

Socket retrieve success 
here 2 
here 3 
here 4 
here 5 
opening port 8888 
binded 
connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd -1connfd 

其中由-1,我可以猜测连接失败。 我不知道我失踪了什么?

+0

你应该后'connfd%D',要不然就把一个'\ N' printf的输出将被缓冲,当它发生时你不会看到它。你也可以调用'fflush'来打印缓冲输出 – Eregrith

+0

@Eregrith:你是对的..所以基本上,连接失败瞬间..但我不知道..为什么服务器不接受客户端连接.. – Fraz

+0

看看'errno'和'perror'也许可以帮助,将它与[connect()手册](http://linux.die.net/man/2/connect) – Eregrith

回答

2

在呼叫accept()之前,服务器错过了在绑定套接字上调用listen()


而且这个

serv_addr.sin_addr.s_addr = server; 

应该发出编译器警告。你不能指定一个C-字符串(我认为server是)到一个in_addr_tserv_addr.sin_addr.s_addr是什么)。

修复此做:

serv_addr.sin_addr.s_addr = inet_addr(server); 

或更好的错误检查,这一点,像这样:

{ 
    in_addr_t in_addr = inet_addr(server); 
    if (INADDR_NONE == in_addr) 
    { 
    perror("inet_addr() failed"); 
    abort(); /* or whatever error handling you choose. */ 
    } 

    serv_addr.sin_addr.s_addr = in_addr; 
} 
+0

叶普..那没有解决..所以现在服务器正在等待传入连接..但客户端无法连接到它..我错过了我的客户端代码上的任何东西? – Fraz

+0

好吧..所以我能够做到这一点..而不是本地主机,如果我有serv_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);那它工作正常吗?但我其实有字符串本地主机?有没有办法来初始化localhost..indows 127.0.0.1 – Fraz

+0

我得到PING本地主机(127.0.0.1)56(84)字节的数据。 从本地主机(127.0.0.1)64字节:icmp_seq = 1 ttl = 64时间= 0.011毫秒 本地主机(127.0.0.1)64字节:icmp_seq = 2 ttl = 64时间= 0.018 ms 但是,当我使用localhost 127.0.0.1,客户端连接失败(返回-1) – Fraz

相关问题