| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3333 人关注过本帖
标题:为什么TCP服务器与客户端在同一台机器上运行时无法建立连接
只看楼主 加入收藏
莲子荷花
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2015-4-1
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:6 
为什么TCP服务器与客户端在同一台机器上运行时无法建立连接
如题,在有的机器上又可以,均使用eth0的IP地址。在不同机器上运行是毫无问题
搜索更多相关主题的帖子: 客户端 机器 运行 建立 连接 
2017-10-31 09:54
莲子荷花
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2015-4-1
收藏
得分:0 
服务端代码
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>           /* See NOTES */
#include <stdlib.h>
#include <string.h>

#define N 1024
//./a.out ip port
int main(int argc, const char *argv[])
{
    char buf[1024] = {0};
    int listen_fd = 0;
    int connect_fd = 0;
    struct sockaddr_in my_addr;
    struct sockaddr_in client_addr;
    int len = sizeof(my_addr);
    int n = 0 ;
    if(argc < 3)
    {
        fprintf(stderr,"Usage : %s ip port!\n",argv[0]);   
        exit(EXIT_FAILURE);
    }

    //1.通过socket创建监听套接字
    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen_fd < 0)
    {
        perror("Fail to socket");   
        exit(EXIT_FAILURE);
    }

    //2.填充服务器自己的ip地址和端口
    memset(&my_addr,0,sizeof(my_addr));   
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = htons(atoi(argv[2]));
    my_addr.sin_addr.s_addr = inet_addr(argv[1]);

    //3.把ip和port进行绑定
    if(bind(listen_fd,(struct sockaddr *)&my_addr,len) < 0)
    {
        perror("Fail to bind");   
        exit(EXIT_FAILURE);
    }

    //4.监听客户端的连接
    listen(listen_fd,5);
    printf("Listen....\n");
        

    //5.准备接收客户端的连接请求
    connect_fd = accept(listen_fd,(struct sockaddr *)&client_addr,&len);        
    if(connect_fd < 0)
    {
        perror("Fail to accept");   
        exit(EXIT_FAILURE);
    }

    printf("=============================================");
    printf("connect_fd : %d\n",connect_fd);
    printf("client IP : %s\n",inet_ntoa(client_addr.sin_addr));
    printf("client port : %d\n", ntohs(client_addr.sin_port));

    while(1)
    {
        memset(buf,0,sizeof(buf));
        n = recv(connect_fd,buf,sizeof(buf),0);   
        if(n < 0)
        {
            perror("Fail to recv!\n");   
            exit(EXIT_FAILURE);
        }else if(n == 0){
            printf("clinet is not connect\n");   
            exit(EXIT_FAILURE);
        }

        if(strncmp(buf,"quit",4) == 0)
            break;

        printf("Recv %d bytes : %s\n",n,buf);
    }

    close(listen_fd);
    close(connect_fd);
    exit(EXIT_SUCCESS);
}
2017-10-31 10:01
莲子荷花
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2015-4-1
收藏
得分:0 
客户端代码
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>           /* See NOTES */
#include <stdlib.h>
#include <string.h>

#define N 1024
//./a.out ip port
int main(int argc, const char *argv[])
{
    char buf[1024] = {0};
    int sockfd = 0;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int len = sizeof(server_addr);
    int n = 0 ;
    if(argc < 3)
    {
        fprintf(stderr,"Usage : %s ip port!\n",argv[0]);   
        exit(EXIT_FAILURE);
    }

    //1.通过socket创建监听套接字
    sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(sockfd < 0)
    {
        perror("Fail to socket");   
        exit(EXIT_FAILURE);
    }

    //2.填充服务器自己的ip地址和端口
    memset(&server_addr,0,sizeof(server_addr));   
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(atoi(argv[2]));
    server_addr.sin_addr.s_addr = inet_addr(argv[1]);

    //3.准备向服务端的请求连接
    if(connect(sockfd,(struct sockaddr *)&server_addr,len) < 0)
    {
        perror("Fail to accept");   
        exit(EXIT_FAILURE);
    }

    while(1)
    {
        memset(buf,0,sizeof(buf));
        putchar('>');
        fgets(buf,sizeof(buf),stdin);
        buf[strlen(buf) - 1] = '\0';

        n = send(sockfd,buf,strlen(buf),0);   

        if(n < 0)
        {
            perror("Fail to recv!\n");   
            exit(EXIT_FAILURE);
        }else if(n == 0){
            printf("clinet is not connect\n");   
            exit(EXIT_FAILURE);
        }

        if(strncmp(buf,"quit",4) == 0)
            break;

    }

    close(sockfd);
    exit(EXIT_SUCCESS);
}

2017-10-31 10:02
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:20 
什么平台运行的?
2017-10-31 10:41
莲子荷花
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2015-4-1
收藏
得分:0 
回复 4楼 吹水佬
linux,我在windows按同样流程写的TCP服务器与客户端也有这问题

[此贴子已经被作者于2017-10-31 10:57编辑过]

2017-10-31 10:54
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10527
专家分:42899
注 册:2014-5-20
收藏
得分:0 
以下是引用莲子荷花在2017-10-31 10:54:36的发言:

linux,我在windows按同样流程写的TCP服务器与客户端也有这问题

在同一台调试 client/server IP可用127.0.0.1
2017-10-31 14:55
莲子荷花
Rank: 2
等 级:论坛游民
帖 子:7
专家分:20
注 册:2015-4-1
收藏
得分:0 
回复 6楼 吹水佬
十分感谢,使用本地环回IP可以成功通信了。不能通信的原因是本地环回IP没有被打开

[此贴子已经被作者于2017-11-1 14:02编辑过]

2017-11-01 13:59
快速回复:为什么TCP服务器与客户端在同一台机器上运行时无法建立连接
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014936 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved