首先列举所需要的头文件

#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的协议地址属性的更多相关文章

  1. IP协议/地址(IPv4&IPv6)概要

    IP协议/地址(IPv4&IPv6)概要 IP协议 什么是IP协议 IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议. [1] 协议的特征 无连 ...

  2. TCPIP、Http、Socket的协议~ 写得挺形象,赞

    这篇文章写得挺形象,对TCPIP.HTTP.Socket的作用有一个整体层次的理解. 转载文章内容如下: 网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层.   通过初步的了 ...

  3. 应用代理 socket TCP协议 的资料

    http://blog.csdn.net/guowake/article/details/6615728 Linux下高并发socket最大连接数所受的各种限制 http://stackoverflo ...

  4. socket测试远程地址能否连接并为连接设置超时

    public class TestConnect { string hostIp = ""; ; public string recMsg = ""; Sock ...

  5. Unity3d之Socket UDP协议

    原文地址:http://blog.csdn.net/dingkun520wy/article/details/49201245 (一)Socket(套接字)UDP协议的特点 1.是基于无连接的协议,没 ...

  6. socket测试远程地址能否连接并为连接设置超时(转)

    public   class TestConnect { string hostIp = ""; int port = 3314; public string recMsg = & ...

  7. python网络编程--socket,网络协议,TCP

    一. 客户端/服务端架构(用到网络通信的地方) 我们使用qq.微信和别人聊天,通过浏览器来浏览页面.看京东的网站,通过优酷.快播(此处只是怀念一下)看片片啥的等等,通过无线打印机来打印一个word文档 ...

  8. TCP通讯socket自定义协议的实现

    转发(JAVA):http://blog.csdn.net/u010818425/article/details/53448817 一个简单的自定义通信协议(socket),http://blog.c ...

  9. iOS 利用Socket UDP协议广播机制的实现

    1.前言 什么是UDP协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...

随机推荐

  1. Android(java)学习笔记228:服务(service)之绑定服务调用服务里面的方法

    1.绑定服务调用服务里面的方法,图解: 步骤: (1)在Activity代码里面绑定 bindService(),以bind的方式开启服务 :                     bindServ ...

  2. PHPMailer中文说明

    PHPMailer中文说明 A开头: $AltBody --属性出自:PHPMailer ::$AltBody文件:class.phpmailer .php说明:该属性的设置是在邮件正文不支持HTML ...

  3. PHP接口的声明与引用

    PHP接口的声明与引用 <?php//遵循规律:先继承,后接口//单继承,多接口class lei{function fangfa(){return "中国电信提醒您:<br&g ...

  4. (转)H264(NAL简介与I帧判断)

    1.NAL全称Network Abstract Layer, 即网络抽象层.         在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(N ...

  5. 手动导出Excel及Excel导出原理探究

    前言:不知道大家有没碰到过,官方大型网站(例如中国移动)上很多地方查询列表是不提供数据导出的,而且界面上的筛选也无法满足我们的需求. 这时候我就想,如果能导出成Excel并借助自带的数据筛选方便多了. ...

  6. .Net程序员关于微信公众平台测试账户配置 项目总结

    今天项目第一次验收,夜晚吃过晚饭后,想把项目中用到的关于微信配置总结一下,虽然网上关于这方面的资料很多很多,还有官方API,但是总感觉缺点什么,就像期初做这个项目时,各方面找了很久的资料,说说配置吧! ...

  7. 探究Activity的各回调方法

    刚毕业那会儿,一心想朝着java web的方向进军,却岂料实习的时候阴差阳错地踏入了Android的大门,自此人生跌宕起伏.坎坎坷坷,在一家外企参与了几个需要越过GFW才能使用的有关于体育赛事的项目, ...

  8. 【SQL Server】SQL与Excel的数据互通导入导出

    转载至:http://jingyan.baidu.com/article/73c3ce28c839b7e50243d950.html

  9. show_space.sql.txt

    create or replace procedure SHOW_SPACE(P_SEGNAME   IN VARCHAR2, P_OWNER     IN VARCHAR2 DEFAULT USER ...

  10. 【转】 Xcode基本操作

    原文: http://blog.csdn.net/phunxm/article/details/17044337 1.IDE概览 Gutter & Ribbon 焦点列:灰色深度与代码嵌套深度 ...