首先列举所需要的头文件

#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. 【分享】w32service table XPsp2

    Ord   Address   fnAddr   Symbols-------------------------------- [  0] BF999280: BF93569A (win32k!Nt ...

  2. JavaScript自动关闭窗口

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. jquery.placeholder.js的使用

    最近做东西用到placeholder这个属性,可是这个属性在低版本的IE或者QQ浏览器等这些浏览器上这个属性不能生效,后来在网上查了下,发现了jquery的一个插件jquery.placeholder ...

  4. js异步的理解---千呼万唤始出来啊!

    编译完成后(先分配给变量空间和function(){}命名的函数,var = function(){}这种函数也仅仅只是分配了个空间,还没有赋值个函数给他!),调用了若不是undefined就执行, ...

  5. 写代码要注意细节,无谓的找前台bug

    <input type="checkbox" name="ckb" value="'+value[0]+'">'真的感觉小细节真 ...

  6. 关于图表的JS插件

    http://echarts.baidu.com/ http://echarts.baidu.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6% ...

  7. Delphi PChar与String互转

    1.String转化成PChar 例: var str: string; pStr:PChar; ... pStr := PChar(str); 2.PChar转String 例: var pStr: ...

  8. Linux shell日常命令和技巧

    转自:http://www.vaikan.com/linux-shell-tips-and-tricks/ 原文:http://www.techbar.me/linux-shell-tips/ 使用L ...

  9. [Head First设计模式笔记]----命令模式

    命令模式定义:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 类图: 适用设计方案举例:实现一种遥控器,该遥控器具有七个可编程的插槽(每个都可以指 ...

  10. C#实现的异步Socket服务器

    介绍 我最近需要为一个.net项目准备一个内部线程通信机制. 项目有多个使用ASP.NET,Windows 表单和控制台应用程序的服务器和客户端构成. 考虑到实现的可能性,我下定决心要使用原生的soc ...