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协议广播机制? 举一个例. 比如在一群人群中,一个人要找张三,于是你向人群里大喊一声(广播):"谁是张三" 假设它是张三,它就会回应你.在网络中也是一样的. ...
随机推荐
- masonry使用介绍
Masonry使用介绍 下面是Masonry的代码地址:https://github.com/Masonry/Masonry 介绍一个简单使用: <pre><code>[vie ...
- ios中xib的使用介绍
ios中Xib的使用 ios中xib的使用 Nib files are the quintessential(典型的) resource type used to create iOS and Mac ...
- Entity Framework CodeFirst------数据迁移(二)
众所周知当我们的项目涉及到数据库时,随着需求或大或小的 变更后,我们之前设计好的数据模型会发生部分的更改,导致数据表.或者数据字段的增加.修改等,这个时候我们就需要对数据库结构进行修改,如果我们之前采 ...
- java中的泛型(转)
什么是泛型? 泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个 ...
- 9.6noip模拟试题
题目名称 盘子序列 四轮车 点名 提交文件 disk.pas/c/cpp car.pas/c/cpp rollcall.pas/c/cpp 输入文件 disk.in car.in rollcall.i ...
- codevs 1282 约瑟夫问题(线段树)
#include<iostream> #include<cstdio> #include<cstring> #define maxn 30010 using nam ...
- HDU5339
题意:给你数a和数组b,然后用a模b中的数,求至少模多少个才能使a==0 思路:直接模拟吧,首先排序,因为模最大的符合(比如2,3,6)然后遍历b,去模其他的所有数,直到为0,标记退出,否则继续遍历b ...
- CSS3简单的空调
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- How JSP work.
A JSP page exists in three forms: JSP source code: consists of a mix of HTML template code. Java lan ...
- 该项目中不存在目标 precomputecompiletypescript The target "PreComputeCompileTypeScript" does not exist in the project
Open Microsoft.TypeScript.targets file located under C:\Program Files (x86)\MSBuild\Microsoft\Visual ...