Socket的协议地址属性
首先列举所需要的头文件
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <assert.h>
#include <string.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netdb.h> /**************************************
函数名:CreateSock
参数:
pSock:回传创建的侦听套接字描述符
nPort:指定套接字侦听端口
nMax:该套接字最大连接数
函数功能:封装套接字的创建、命名和侦听
返回值:0
**************************************/
int CreateSock(int *pSock, int nPort , int nMax)
{
struct sockaddr_in addrin;
struct sockaddr *paddr = (struct sockaddr*)&addrin; assert(pSock != NULL && nPort > && nMax > );
memset(&addrin, ,sizeof(addrin)); addrin.sin_family = AF_INET;
addrin.sin_addr.s_addr = htonl(INADDR_ANY);
addrin.sin_port = htons(nPort); /*创建TCP套接字描述符*/
*pSock = socket(AF_INET, SOCK_STREAM, ); /*命名套接字*/
bind(*pSock, paddr, sizeof(addrin)); /*进入侦听状态*/
listen(*pSock, nMax); return ;
} /**************************************
函数名:AcceptSock
参数:
pSock:创建的新的套接字描述符与客户
进程通信
nSock:accept成功后依然用于套接字侦听
函数功能:接受客户端的套接字连接申请
返回值:0
**************************************/ int AcceptSock(int *pSock, int nSock)
{
struct sockaddr_in addrin;
int lSize;
assert(pSock != NULL && nSock > );
while()
{
lSize = sizeof(addrin);
memset(&addrin, , sizeof(addrin));
if((*pSock = accept(nSock, (struct sockaddr*)&addrin, &lSize)) > )
return ; else
assert();
}
} /**************************************
函数名:LocateRemoteAddr
参数:
nSock:本地与用户通信的套接字描述符
pAddr:缓冲区,用来存储客户端IP地址
函数功能:获取与本地通信的客户端IP地址
返回值:
成功:0
失败:-1
**************************************/ int LocateRemoteAddr(int nSock, char *pAddr)
{
struct sockaddr_in addrin;
int lSize; /*将addrin结构清零*/
memset(&addrin, , sizeof(addrin)); lSize = sizeof(addrin); if(getpeername(nSock, (struct sockaddr *)&addrin, &lSize) >= )
{
strcpy(pAddr,inet_ntoa(addrin.sin_addr));
return ;
} else
return -; }
一、Socket的域名地址
这里实现一个功能,即将域名转化为IP地址,并以字符串的形式输出。
使用到的函数:struct hostent *gethostbyname(const char *name);
参数:想要查询的IP对应的域名
返回值:
成功:指向hostent结构的指针
失败:NULL
/**************************************
文件名:tcp2.c
Author:Bumble Bee
日期:2015-3-24
文件说明:已知网站IP,获取其域名,域名
通过命令行输入
**************************************/
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <stdio.h>
#include <netdb.h> int main(int argc, char **argv)
{
struct hostent *host;
if(argc != )
{
printf("please enter host name\n");
return ;
}
if((host = gethostbyname(argv[])) == NULL)
{
herror("gethostbyname");
return ;
}
printf("Host name is %s\n", host->h_name);
printf("Host IP is %s\n", inet_ntoa((host->h_addr))); return ;
}


二、Socket端口
Linux提供了很多网络服务进程,每个进程都会占用一个TCP端口在后台进行套接字侦听,一般情况系统占用小于1024的端口号。这里实现通过系统服务进程查看端口号和通过端口号查看系统服务进程。
使用函数:struct servent *getservbyname(const char *name, const char *proto);
struct servent *getservbyport(int port, const char *proto);
参数:
name:服务进程的名称
proto:该服务使用协议定名称
port:端口号
返回值:
成功:指向结构servent的指针
失败:NULL
通过系统服务进程查看端口号
/**************************************
文件名:tcp4.c
Author:Bumble Bee
日期:2015-3-25
文件说明:通过系统服务进程查看端口号
**************************************/ #include "socket.h" int main(int argc, char **argv )
{
struct servent *serv;
if(argc != )
return ;
if((serv = getservbyname(argv[],"tcp")) == NULL)
{
herror("getsercbyname");
return ;
} printf("Serv name :%s\n",serv->s_name );
printf("Serv Port :%d\n",ntohs(serv->s_port)); return ;
}

通过端口号查看系统服务进程
/**************************************
文件名:tcp2.c
Author:Bumble Bee
日期:2015-3-25
文件说明:通过端口号查看系统服务进程
**************************************/ #include "socket.h" int main(int argc, char **argv )
{
struct servent *serv;
if(argc != )
return ;
if((serv = getservbyport(htons(atoi(argv[])), "tcp"))== NULL) //使用网络字节序,而且要将字符串转换为整形数字
{
herror("getsercbyport");
return ;
} printf("Serv name :%s\n",serv->s_name );
printf("Serv Port :%d\n",ntohs(serv->s_port)); return ;
}

三、Socket的协议地址
当本地套接字与远程建立连接后,就可以获取双方的IP地址。这里介绍获取远程客户端的IP地址。
使用函数:int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd:本地建立连接使用的套接字描述符
addr:与sockfd连接的套接字协议地址信息
addrlen:addr结构的长度
为了提高代码重用度,我们在此将getpeername函数进行封装,代码如下:
/**************************************
函数名:LocateRemoteAddr
参数:
nSock:本地与用户通信的套接字描述符
pAddr:缓冲区,用来存储客户端IP地址
函数功能:获取与本地通信的客户端IP地址
返回值:
成功:0
失败:-1
**************************************/ int LocateRemoteAddr(int nSock, char *pAddr)
{
struct sockaddr_in addrin;
int lSize; /*将addrin结构清零*/
memset(&addrin, , sizeof(addrin)); lSize = sizeof(addrin); if(getpeername(nSock, (struct sockaddr *)&addrin, &lSize) >= )
{
strcpy(pAddr,inet_ntoa(addrin.sin_addr));
return ;
} else
return -; }
这里实现功能:获取与本地通信的远程端IP地址并输出。
/**************************************
文件名:tcp5.c
Author:Bumble Bee
日期:2015-3-26
文件说明:获取与本地通信的客户端IP地址
**************************************/ #include "socket.h" int main()
{
int nSock, pSock;
char szAddr[]; if(CreateSock(&nSock,,) !=)
return ;
AcceptSock(&pSock,nSock); LocateRemoteAddr(pSock,szAddr); fprintf(stderr, "ip is %s\n", szAddr); close(pSock); close(nSock);
}
执行该程序后,该进程进入阻塞态,等待用户与其通信。
我们在win下打开命令行,使用telnet IP地址 端口号 与linux通信。


这次就记录到这里,如果有疑问或错误,欢迎指出
Socket的协议地址属性的更多相关文章
- IP协议/地址(IPv4&IPv6)概要
IP协议/地址(IPv4&IPv6)概要 IP协议 什么是IP协议 IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. [1] 协议的特征 无连 ...
- TCPIP、Http、Socket的协议~ 写得挺形象,赞
这篇文章写得挺形象,对TCPIP.HTTP.Socket的作用有一个整体层次的理解. 转载文章内容如下: 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了 ...
- 应用代理 socket TCP协议 的资料
http://blog.csdn.net/guowake/article/details/6615728 Linux下高并发socket最大连接数所受的各种限制 http://stackoverflo ...
- socket测试远程地址能否连接并为连接设置超时
public class TestConnect { string hostIp = ""; ; public string recMsg = ""; Sock ...
- Unity3d之Socket UDP协议
原文地址:http://blog.csdn.net/dingkun520wy/article/details/49201245 (一)Socket(套接字)UDP协议的特点 1.是基于无连接的协议,没 ...
- socket测试远程地址能否连接并为连接设置超时(转)
public class TestConnect { string hostIp = ""; int port = 3314; public string recMsg = & ...
- python网络编程--socket,网络协议,TCP
一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...
- TCP通讯socket自定义协议的实现
转发(JAVA):http://blog.csdn.net/u010818425/article/details/53448817 一个简单的自定义通信协议(socket),http://blog.c ...
- iOS 利用Socket UDP协议广播机制的实现
1.前言 什么是UDP协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...
随机推荐
- HDU 3037(Lucas定理)
对于很大的组合数不能用C(n, m) = C(n - 1, m) + C(n-1, m -1)来求,这里就用到Lucas定理. 模板题: hdu3037:模板如下: #include <cstd ...
- 【开源java游戏框架libgdx专题】-07-文件处理
介绍:文件处理在不同平台的文件管理是略有差异的 Desktop(Windows,Linux,Mac OS X等等):在桌面系统中,文件系统是一个大块的内存.文件可以通过当前的工作目录或者绝对路径被引用 ...
- p标签里面不能嵌套div
先申明本人代码水平为零起点,刚开始学习前端,所以就是小白.不过大神也是小白变身的么,所以要专心码代码,潜心钻研,haha~ 今天练习了段代码,发现效果和自己想象的不一样: 想了一下估计是<p&g ...
- javascript实现Map
function Map() { this.elements = new Array(); // 获取MAP元素个数 this.size = function() { return this.elem ...
- SQL 插入查询的最大ID 号 进行批量
INSERT INTO tbl_image_language ( code, docomo_cd, au_cd, softbank_cd ) SELECT DISTINCT((SELECT max(c ...
- 把某个asp.net 控件 替换成 自定义的控件
功能:可以把某个asp.net 控件 替换成 自定义的控件 pages 的 tagMapping 元素(ASP.NET 设置架构) 定义一个标记类型的集合,这些标记类型在编译时重新映射为其他标记类型. ...
- HTML5 History对象,Javascript修改地址栏而不刷新页面
一.History对象 History 对象包含用户(在浏览器窗口中)访问过的 URL. History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问. ...
- Linux 网络配置(固定IP)
通常linux作为服务器系统时,是不推荐安装图形界面的,因此我们需要掌握非图形界面下如何配置网络,主要两种方式,如下: 一.使用SETUP工具(redhat系列才可以,推荐此修改方式) 1.在命令行直 ...
- 关于Jquery.Data()和HTML标签的data-*属性
人们总喜欢往HTML标签上添加自定义属性来存储和操作数据.但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它副 ...
- jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。
冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 下面是html代码部分: <body> <div id="content"> 外层div元素 ...