Socket programing(make a chat software) summary 1:How to accsess LAN from WAN
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的更多相关文章
- 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 ...
- (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 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- C# socket 实现消息中心向消息平台 转发消息 (修改)
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
- C# socket 实现消息中心向消息平台 转发消息
公司用到,直接粘代码了 using System; using System.Collections.Generic; using System.Configuration; using System ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- WPF socket通讯 UDP接收消息
客户端: private Socket socket; private IPEndPoint ipEndPoint; private void sendMessageHandler() { //服务端 ...
- C# 实现的多线程异步Socket数据包接收器框架
转载自Csdn : http://blog.csdn.net/jubao_liang/article/details/4005438 几天前在博问中看到一个C# Socket问题,就想到笔者2004年 ...
- Socket(TCP)客户端请求和服务端监听和链接基础(附例子)
一:基础知识回顾 一: Socket 类 实现 Berkeley 套接字接口. Socket(AddressFamily, SocketType,ProtocolType) 使用指定的地址族.套接字类 ...
随机推荐
- 记一次在java中的日期parse错误
String dateString = "2014101517"; new SimpleDateFormat("yyyyMMddHH").parse(dateS ...
- getComputedStyle 方法
一:getComputedStyle getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object CSSStyleDeclarat ...
- iTerm 2 && Oh My Zsh
一年前,在搞终端的时候偶然一次机会,让我看到了各种强大的DIY界面,这让我很想去自己搞一个.于是在网上不断的寻找资源,也请教了大多数朋友.最终以失败告终.最近,本人又突然想起当时这件事,于是,决定边做 ...
- Haxe是何物?
最近对haxe很感兴趣,用一种语言统一所有的语言和平台,野心很大. 详细的介绍园子里已有大神发过,地址在这里:http://www.cnblogs.com/xiaotie/archive/2012/0 ...
- oracle中批量生成字段类型的脚本
select ' ALTER TABLE '||table_name || ' MODIFY( '|| column_name || ' DATE );' from USER_TAB_COLUMNS ...
- log4j 配置INFO 和DEBUG 分布输出至两个文件
博客地址: http://blog.csdn.net/wangchsh2008/article/details/8812857
- 为Python安装pymssql模块来连接SQLServer
1.安装依赖包 yum install -y gcc python-devel 2.安装freetds 下载地址:http://pan.baidu.com/s/1pLKtFBl tar zxvf fr ...
- bzoj1009矩阵快速面+kmp
其实kmp真的很次要,求长度为20的kmp感觉真的有点杀鸡用牛刀 这题思路相当明确:一看题就是数位dp,一看n的大小就是矩阵 矩阵的构造用m*m比较方便,本来想写1*m的矩阵乘m*m的,但是感觉想起来 ...
- UBUNTU 16.04 编译 OPENJDK8
参考了几篇文章,和错误查询,最后总结如下 一.下载 我比较倾向于使用mercurial来获取源代码,虽然你得挑网络稳定的时候更新,但是易更新. 从官网查找一下,可以通过以下步骤完成源代码的下载 1. ...
- myEclipse Could not create the view: An unexpected exception was thrown.
myEclipse 非正常关闭,打开后 service Explorer or Package Explorer 视图显示不出来.报“Could not create the view: An une ...