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协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...
随机推荐
- JDK5-静态导入
import static 1. 导入一个类内所有静态成员 import static java.lang.Math.*; public class StaticImport { public sta ...
- DTD简单使用
DTD:Document Type Definition DTD是一种简单的XML约束模式语言 DTD文档必须以utf-8或unicode编码 注释方式与HTML.XML文档相同 DTD文档的引用:紧 ...
- Android(java)学习笔记224:横竖屏切换时Activity的生命周期
1.横竖屏切换的生命周期 默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...
- NYOJ 1107 最高的奖励(贪心+优先队列)
最高的奖励 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 请问:挖掘机技术哪家强?AC了告诉你! 给你N(N<=3*10^4)个任务,每个任务有一个截止完成时 ...
- java之JDBC
java之JDBC 一.什么是JDBC Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提 ...
- 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>
前台datagrid数据绑定 #region 导出到excel中 /// <summary> /// 2014-6-6 /// </summary> / ...
- 计时器(Chronometer)的使用
安卓提供了一个计时器组件:Chronometer,该组件extends TextView,因此都会显示一段文本,但是它显示的时间是从某个起始时间开始过去了多少时间,它只提供了android:forma ...
- iOS开发网络资源整理-持续更新
本文记录iOS开发相关的网络社区和博客 1.objc中国 网址:http://objccn.io 简介:onevcat创建,项目的成立源于国内 Objective-C 社区对 objc.io 的翻译活 ...
- 一种实现C++反射功能的想法(一)
Java的反射机制很酷, 只需知道类的名字就能够加载调用. 这个功能很实用, 想象一下, 用户只需指定类的名称, 就可以动态绑定类型, 而且只需通过字符串指定, 字符串的使用可以使得用户的修改只需修改 ...
- MyBatis学习笔记(1) —— 基础知识
mybatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层框架,mybatis 清除了几乎所有的jdbc代码和参数的手工设置及对结果集的检索封装.mybatis可以使用简单的xml和注解用于 ...