读书人

socket通信有关问题

发布时间: 2012-05-15 14:35:29 作者: rapoo

socket通信问题
在虚拟机下的fedora里面写了个server和client程序。
测试正常。现在想测试下怎么让网络上的client找到server。
然后向server发送信息。防火墙都关闭了。
虚拟机联网方式是nat。服务都开了。虚拟机里面的可以ping通
各个网站。现在就在怎么让client连接服务器了。求教育啊
server.c

C/C++ code
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#define MAX 100void deal(char *src){    if (src == NULL)        return ;    for (; *src != '\0'; src++){        if (*src >= 'A' && *src <= 'Z'){            *src = *src - 'A' + 'a';        }    }}int main(){    struct sockaddr_in sin;    struct sockaddr_in cin;    int sockfd, cfd;    socklen_t len;    char buf[MAX];    char addr_p[INET_ADDRSTRLEN];//存储客户端地址的缓冲区    int port = 8000;    int n;//读写字节数    //对结构体清空    bzero(&sin, sizeof(sin));    sin.sin_family = AF_INET;//ipv4    sin.sin_port = htons(port);//端口号转换为网络字节序    sin.sin_addr.s_addr = INADDR_ANY;//服务器接受任意地址    sockfd = socket(AF_INET, SOCK_STREAM, 0);//0表示使用默认的协议    bind(sockfd, (struct sockaddr *)&sin, sizeof(sin));//将地址和套接字绑定    listen(sockfd, 10);//监听,最多可以处理10个请求    printf("waiting...\n");    while (1){        //接受连接,返回新创建的socket描述符        cfd = accept(sockfd, (struct sockaddr *)&cin, &len);        n = read(cfd, buf, MAX);//读取客户端传来的信息        inet_ntop(AF_INET, &cin.sin_addr, addr_p, sizeof(addr_p));        //将客户端地址转换为字符串        printf("client IP is %s,port is %d\n", addr_p, ntohs(cin.sin_port));        printf("content is : %s\n", buf);        deal(buf);        write(cfd, buf, n);//发给客户端        printf("after deal the content is : %s\n", buf);        close(cfd);//通讯结束,准备下一次通信    }    if (close(sockfd) == -1){        perror("fail to close");        exit(1);    }    exit(0);}

client.c
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>#define MAX 100int main(int argc, char *argv[]){    struct sockaddr_in sin;//服务器地址    char buf[MAX];    int sockfd;    int port = 8000;    char *p = "test string";//默认字符串    char *str = p;    if (argc > 1){        str = argv[1];    }    bzero(&sin, sizeof(sin));    sin.sin_family = AF_INET;    inet_pton(AF_INET, "192.168.1.1", &sin.sin_addr);        //问题就在这里。当我把这个ip改为自己的网络ip,然后把客户端         //放到网络上的另一台主机上。让它来连接服务器。但是没反应         //不知道为啥        //这里的ip应该为服务器的网络ip。但没写上去。就写了个私有ip    sin.sin_port = htons(port);//和服务器同样的端口号    sockfd = socket(AF_INET, SOCK_STREAM, 0);        connect(sockfd, (struct sockaddr *)&sin, sizeof(sin));    //主动连接服务器    write(sockfd, str, strlen(str) + 1);    //该串不包括'\0'    //读取服务器程序发回的串,由于是同一台机器,不存在延时    //真正的网络环境,要处理延时    read(sockfd, buf, MAX);    printf("recive form server : %s\n", buf);    close(sockfd);    exit(0);}


[解决办法]
NAT只能帮助你的虚拟机LINUX上外网,局域网内其他机器和外网是无法主动连接你的,因为虚拟机根本不会把局域网机器发来的包NAT到你的虚拟机。

只有你的虚拟机主动连接外网的时候才会被NAT映射,所以楼主放弃吧。 我从没用过虚拟机软件设置NAT规则,里边有个PORT FORWARDING,也没看懂是不是修改NAT映射的地方,如果可以的话你就可以修改NAT规则,将流量以太网卡的XXX端口的包NAT到虚拟机网卡。

读书人网 >UNIXLINUX

热点推荐