socket编程(socket编程为什么要选择AF_INET)

本文目录
- socket编程为什么要选择AF_INET
- socket网络编程
- TCP 和 UDP 在socket编程中的区别
- 1、基于套接字Socket通信的编程: 建立TCPSocket进行通信,服务器端向客户端传送日期数据,客户端收到信息
- 通过Socket实现网络编程的主要过程是什么
- socket编程怎么实现数据包的转发C语言版的
- 网络编程技术半相关和全相关的概念
- java中什么是socket编程
- socket套接字编程实验 怎么做
- socket编程,出现乱码
socket编程为什么要选择AF_INET
选择 AF_INET 的目的就是使用 IPv4 进行通信。因为 IPv4 使用 32 位地址,相比 IPv6 的 128 位来说,计算更快,便于用于局域网通信。
而且 AF_INET 相比 AF_UNIX 更具通用性,因为 Windows 上有 AF_INET 而没有 AF_UNIX。
注:AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的;而 AF_UNIX 则是 Unix 系统本地通信。
扩展资料:
AF_INET和PF_INET的区别
1、AF 表示ADDRESS FAMILY 地址族
2、PF 表示PROTOCL FAMILY 协议族
3、Winsock2.h中
#define AF_INET 0
#define PF_INET AF_INET
所以在windows中AF_INET与PF_INET完全一样
4、而在Unix/Linux系统中,在不同的版本中这两者有微小差别,对于BSD,是AF,对于POSIX是PF
在函数socketpair与socket的domain参数中有:AF_UNIX,AF_LOCAL,AF_INET,PF_UNIX,PF_LOCAL,PF_INET.
这几个参数有:AF_UNIX=AF_LOCAL, PF_UNIX=PF_LOCAL, AF_LOCAL=PF_LOCAL, AF_INET=PF_INET.
对于socketpair与socket的domain参数,使用PF_LOCAL系列,而在初始化套接口地址结构时,则使用AF_LOCAL.
例如: z = socket(PF_LOCAL, SOCK_STREAM, 0); adr_unix.sin_family = AF_LOCAL;
socket网络编程
客户端与服务端通过socket套字节连接后都会返回一个实例对象,分别保存这个对象,就相当于保存的对方的地址。不同的客户端连接到服务器,得到的对象都是不同的。服务端要发信息直接拿这个对象进行操作就可以了。
很久没写了,具体名称记不起来了,思路就是这样的
TCP 和 UDP 在socket编程中的区别
UDP和TCP编程步骤也有些不同,如下:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); * 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
与之对应的UDP编程步骤要简单许多,分别如下:
UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收数据,用函数recvfrom();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();* 可选
3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、设置对方的IP地址和端口等属性;
5、发送数据,用函数sendto();
6、关闭网络连接;
1、基于套接字Socket通信的编程: 建立TCPSocket进行通信,服务器端向客户端传送日期数据,客户端收到信息
//获取时间
CString strTime;
CTime st = CTime::GetCurrentTime();
strTime = st.Format(“%Y%m%d%H%M%S“);
//创建服务器端
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
int opt = 1;
int len11 = sizeof(opt);
setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,len11);
if (sock == INVALID_SOCKET)
{
// “初始化失败“ ;
closesocket(sock);
return;
}
SOCKADDR_IN addrsrv;
addrsrv.sin_family = AF_INET;
addrsrv.sin_port = htons(6001);
addrsrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
if (bind(sock,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
// “绑定失败“
closesocket(sock);
return;
}
listen(sock,10);
//客户端接收服务器连接
char m_recvBuf;
memset(m_recvBuf, 0, 2000);
while(TRUE)
{
SOCKET sNew = ::accept(sock, (SOCKADDR*)&addrRemote, &nAddrLen);//接收到客户端连接
//发送时间
int hvsndlen = 0;
int sndlen = 0;
while ((len -hvsndlen) 》 0)
{
sndlen = send(soc,(LPCTSTR)strTime +hvsndlen,len-hvsndlen,0);
if (sndlen == SOCKET_ERROR)
{
return -1;
}
hvsndlen += sndlen;
}
}
//把以上程序放入你的主程序中,应该可以运行。里面有CString类型,如果用不习惯,你可以把CTime 转换成其他类型
通过Socket实现网络编程的主要过程是什么
TCP/IP网络通讯开发,一般采用Socket开发。它分服务器和客户端。服务器端流程:
1、创建服务器套接字---分配内存、初始化
2、服务器套接字--侦听
3、建立与客户端配套的客户端套接字
4、与客户端通讯(可以多客户端)
5、关闭、销毁服务器端相应套接字
----------------
客户端:
1、创建客户端套接字---分配内存、初始化
2、连接服务器
3、与服务器通讯
4、关闭、销毁客户端套接字
----------------
socket编程怎么实现数据包的转发C语言版的
我也不知道····只好复制一份···共同学习~~ 要写网络程序就必须用Socket,这是程序员都知道的。而且,面试的时候,我们也会问对方会不会Socket编程?一般来说,很多人都会说,Socket编程基本就是listen,accept以及send,write等几个基本的操作。是的,就跟常见的文件操作一样,只要写过就一定知道。对于网络编程,我们也言必称TCP/IP,似乎其它网络协议已经不存在了。对于TCP/IP,我们还知道TCP和UDP,前者可以保证数据的正确和可靠性,后者则允许数据丢失。最后,我们还知道,在建立连接前,必须知道对方的IP地址和端口号。除此,普通的程序员就不会知道太多了,很多时候这些知识已经够用了。最多,写服务程序的时候,会使用多线程来处理并发访问。我们还知道如下几个事实:1。一个指定的端口号不能被多个程序共用。比如,如果IIS占用了80端口,那么Apache就不能也用80端口了。2。很多防火墙只允许特定目标端口的数据包通过。3。服务程序在listen某个端口并accept某个连接请求后,会生成一个新的socket来对该请求进行处理。于是,一个困惑了我很久的问题就产生了。如果一个socket创建后并与80端口绑定后,是否就意味着该socket占用了80端口呢?如果是这样的,那么当其accept一个请求后,生成的新的socket到底使用的是什么端口呢(我一直以为系统会默认给其分配一个空闲的端口号)?如果是一个空闲的端口,那一定不是80端口了,于是以后的TCP数据包的目标端口就不是80了--防火墙一定会组织其通过的!实际上,我们可以看到,防火墙并没有阻止这样的连接,而且这是最常见的连接请求和处理方式。我的不解就是,为什么防火墙没有阻止这样的连接?它是如何判定那条连接是因为connet80端口而生成的?是不是TCP数据包里有什么特别的标志?或者防火墙记住了什么东西?后来,我又仔细研读了TCP/IP的协议栈的原理,对很多概念有了更深刻的认识。比如,在TCP和UDP同属于传输层,共同架设在IP层(网络层)之上。而IP层主要负责的是在节点之间(End to End)的数据包传送,这里的节点是一台网络设备,比如计算机。因为IP层只负责把数据送到节点,而不能区分上面的不同应用,所以TCP和UDP协议在其基础上加入了端口的信息,端口于是标识的是一个节点上的一个应用。除了增加端口信息,UPD协议基本就没有对IP层的数据进行任何的处理了。而TCP协议还加入了更加复杂的传输控制,比如滑动的数据发送窗口(Slice Window),以及接收确认和重发机制,以达到数据的可靠传送。不管应用层看到的是怎样一个稳定的TCP数据流,下面传送的都是一个个的IP数据包,需要由TCP协议来进行数据重组。所以,我有理由怀疑,防火墙并没有足够的信息判断TCP数据包的更多信息,除了IP地址和端口号。而且,我们也看到,所谓的端口,是为了区分不同的应用的,以在不同的IP包来到的时候能够正确转发。TCP/IP只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。就像操作系统会提供标准的编程接口,比如Win32编程接口一样,TCP/IP也必须对外提供编程接口,这就是Socket编程接口--原来是这么回事啊!在Socket编程接口里,设计者提出了一个很重要的概念,那就是socket。这个socket跟文件句柄很相似,实际上在BSD系统里就是跟文件句柄一样存放在一样的进程句柄表里。这个socket其实是一个序号,表示其在句柄表中的位置。这一点,我们已经见过很多了,比如文件句柄,窗口句柄等等。这些句柄,其实是代表了系统中的某些特定的对象,用于在各种函数中作为参数传入,以对特定的对象进行操作--这其实是C语言的问题,在C++语言里,这个句柄其实就是this指针,实际就是对象指针啦。现在我们知道,socket跟TCP/IP并没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以,socket的出现只是可以更方便的使用TCP/IP协议栈而已,其对TCP/IP进行了抽象,形成了几个最基本的函数接口。比如create,listen,accept,connect,read和write等等。现在我们明白,如果一个程序创建了
网络编程技术半相关和全相关的概念
半相关:是一个三元组(协议,本地网络地址,端口号);在全局中唯一地标示一个进程;socket就是半相关描述;
全相关:是一个五元组(协议,本地网络地址,本地端口号,远端网络地址,远端端口号),在网际中唯一地标示一次通信。
java中什么是socket编程
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。
但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
socket套接字编程实验 怎么做
第一步:调用socket()函数创建一个用于通信的套接字。
第二步:给已经创建的套接字绑定一个端口号,这一般通过设置网络套接口地址和调用bind()函数来实现。
第三步:调用listen()函数使套接字成为一个监听套接字。
第四步:调用accept()函数来接受客户端的连接,这是就可以和客户端通信了。
第五步:处理客户端的连接请求。
第六步:终止连接。
socket编程,出现乱码
能不能把你的程序贴上来~~这个要看了之后才能给出确定的答案~~
byte buffer = new byte[4*1024];
char buf[MAX];这只是声明Buf,但是你没有定义它~~~
给你举个例子:DatabaseHelper dbHelper =null;
SQLiteDatabase db = dbHelpe.geteReadableDatabase();
这里DatabaseHelper这是声明了一个 dbHelper,但是没有对他初始化,SQLiteDatabase db = dbHelpe.geteReadableDatabase();中却调用了他的一个方法,就会出现空指针异常~~~

更多文章:
易语言网页api接口怎么调用(易语言,怎么读取网页json的api)
2026年10月11日 08:00
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00








