First we should know some basic conceptions about network:

1.Every PC is supposed to have its own IP,So we can connent other's PC by WAN.That's just like a ID of netwrok world.

    2.But if  every PC has its own IP,Then IPs of this world will be insufficient.Because IPv4 is only 32-bit.

    3.So, in fact we are not using a IP of WAN, but using a IP of LAN.

     If there is a IP of 192.168.2.100 in one LAN, and there will also be another IP of 192.168.2.100 in another LAN.

It's not contradict because we use NAT to convert the IP of LAN into the IP of WAN(the unique ip).

As for my software,I need two PC connected and chatting.But the IP of normal users are all LAN. different LANs.So they can not connect just by Socket program.

So,I must convert the IP from LAN to WAN.

At least one --- the server's.

I use a technique of PORT MAPPING. implemented by  a software called phddns.

Download the phddns: phddns_3.0_x86_64.deb

dpkg -i phddns_3.0_x86_64.deb

Use the SN and password to log in the website of phddns.

Then set the network penetration:

As for the code, very simple C socket program.

/**
* client program of chat
* by localhost pur whoami Atum
* 0ct 5 2016
* version 1.0
**/ #include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/types.h> #define MAXBUF 1024
#define MAC_SIZE 18
#define IP_SIZE 16 // get ip by domain
int get_ip_by_domain(const char *domain, char *ip)
{
char **pptr;
struct hostent *hptr;
hptr = gethostbyname(domain);
if(NULL == hptr)
{
printf("gethostbyname error for host:%s/n", domain);
return -;
}
for(pptr = hptr->h_addr_list ; *pptr != NULL; pptr++)
if (NULL != inet_ntop(hptr->h_addrtype, *pptr, ip, IP_SIZE) )
return ;
return -;
} int main(int argc, char **argv)
{
int sockfd, len;
struct sockaddr_in dest; char buffer[MAXBUF + ];
//1.create socket object
if((sockfd = socket(AF_INET, SOCK_STREAM, )) < )
{
perror("socket");
exit(errno);
}
printf("socket created.\n");
//set dest 0
bzero(&dest, sizeof(dest));
//address protocal
dest.sin_family = AF_INET;
//the port of server
dest.sin_port = htons(atoi(argv[]));
char ip[IP_SIZE];
get_ip_by_domain(argv[], ip);
//get the ip of server
if (inet_aton(ip, (struct in_addr *) &dest.sin_addr.s_addr) == )
{
perror(argv[]);
exit(errno);
}
//connect the server
if(connect(sockfd, (struct sockaddr *) &dest, sizeof(dest)) == -)
{
perror("connect");
exit(errno);
}
printf("server connected\n"); printf("pls send message to send:");
fgets(buffer,MAXBUF,stdin);
send(sockfd,buffer,strlen(buffer) - , );
return ;
}
/**
* server program of lsp-chat
* by WHOAMI localhost purstar Atum
* Oct 5 2016
* version 1.0
**/ #include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h> int main(int argc, char *argv[])
{
unsigned int my_port, lisnum;
int sockfd, new_fd;
socklen_t len;
if (argv[])
my_port = atoi(argv[]);
else
my_port = ;
if (argv[])
lisnum = atoi(argv[]);
else
lisnum = ;
struct sockaddr_in server_addr, clients_addr;
//create socket object
if((sockfd = socket(AF_INET, SOCK_STREAM, ))==-)
{
perror("socket");
exit(EXIT_FAILURE);
}
//set server_addr 0
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(my_port);
if (argv[])
server_addr.sin_addr.s_addr = inet_addr(argv[]);
else
server_addr.sin_addr.s_addr = INADDR_ANY;
//bind the socket with ip and port
if (bind(sockfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -)
{
perror("bind");
exit(EXIT_FAILURE);
}
//listern and wait for connecting
if(listen(sockfd,lisnum) == -)
{
perror("listen");
exit(EXIT_FAILURE);
}
printf("wait for connect\n");
len = sizeof(struct sockaddr);
//get the client connection
if((new_fd = accept(sockfd, (struct sockaddr *) &clients_addr, &len) == -))
{
perror("accept");
exit(EXIT_FAILURE);
}
else
printf("server: got connection from %s, port %d, socket %d\n",inet_ntoa(clients_addr.sin_addr),ntohs(clients_addr.sin_port),new_fd);
return ;
}

Then run the server program and the client program:

parameters are local ip and port.

parameters are domain name and port mapped by phddns

It works.

Test with my friend's help,also no problem:

Socket programing(make a chat software) summary 1:How to accsess LAN from WAN的更多相关文章

  1. 12 Best Live Chat Software for Small Business Compared (2019) 最佳的wordpress在线聊天工具推荐插件 来帮你和潜在客户互动

    12 Best Live Chat Software for Small Business Compared (2019)     Did you know that more than 67% of ...

  2. (OK) Linux epoll模型—socket epoll server client chat

    http://www.cnblogs.com/venow/archive/2012/11/30/2790031.html http://blog.csdn.net/denkensk/article/d ...

  3. .NET开源高性能Socket通信中间件Helios介绍及演示

    一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...

  4. C# socket 实现消息中心向消息平台 转发消息 (修改)

    using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...

  5. C# socket 实现消息中心向消息平台 转发消息

    公司用到,直接粘代码了 using System; using System.Collections.Generic; using System.Configuration; using System ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. WPF socket通讯 UDP接收消息

    客户端: private Socket socket; private IPEndPoint ipEndPoint; private void sendMessageHandler() { //服务端 ...

  8. C# 实现的多线程异步Socket数据包接收器框架

    转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...

  9. Socket(TCP)客户端请求和服务端监听和链接基础(附例子)

    一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...

随机推荐

  1. vuex

    英文:(Introduction)中文:https://github.com/vuejs/vuex/issues/176(贡献者努力中)

  2. Centos 6.5 x64环境下 spark 1.6 maven 编译-- 已验证

    Centos 6.5 x64 jdk 1.7 scala 2.10 maven 3.3.3 cd spark-1.6 export MAVEN_OPTS="-Xmx2g -XX:MaxPer ...

  3. Unity 依赖注入之一

    在项目中引入Unity,建立一个接口IWork跟一个继承IWork接口的Work类 public interface IMyWork { void Work(); } public class MyW ...

  4. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  5. Spark 资源池简介

    在一个application内部,不同线程提交的Job默认按照FIFO顺序来执行,假设线程1先提交了一个job1,线程2后提交了一个job2,那么默认情况下,job2必须等待job1执行完毕后才能执行 ...

  6. Git使用出错:Couldn‘t reserve space for cygwin‘s heap, Win32

    今天使用Git在命令行下更新代码遇到了问题,起初觉得是自己安装某软件导致冲突,从网上搜索了一下找到类似问题,成功解决问题. 错误信息如下: E:\storm-sql>git pull origi ...

  7. 阿里云ECS(Centos)开启X11的步骤

    阿里云ECS(Centos)开启X11的步骤 1.修改sshd_config X11Forwarding yes 2.yum -y install xorg-x11-xauth xorg-x11-ut ...

  8. ANGULAR $HTTP请求【转】

    angular使用post.get向后台传参的问题 一.问题的来源 我们都知道向后台传参可以使用get.put,其形式就类似于name=jyy&id=001.但是在ng中我却发现使用$http ...

  9. 轻松3步实现c#windowsform窗体美化

    1.需要下载IrisSkin4.dll或者IrisSkin2.dll和ssk皮肤文件. 2.添加引用IrisSkin4.dll或者IrisSkin2.dll到项目中,将下载好的ssk皮肤文件复制到项目 ...

  10. java分享第二十天(build.xml的语法及写法)

    通常情况下,Ant构建文件build.xml应该在项目的基础目录.可以自由使用其他文件名或将构建文件中其他位置.在本练习中,创建一个名为build.xml 在电脑的任何地方的文件. <?xml ...