socket编程函数
⑴ Socket 编程中 close() 和 shutdown() 有什么区别
一、指代不同
1、shutdown() :是指禁止在一个套接口上进行数据的接收与发送。
2、close():关闭一个套接口。更确切地说,它释放套接口描述字s,以后对s的访问均以WSAENOTSOCK错误返回。
二、原理不同
1、shutdown() :how参数为0,则该套接口上的后续接收操作将被禁止。这对于低层协议无影响。对于TCP协议,TCP窗口不改变并接收前来的数据(但不确认)直至窗口满。对于UDP协议,接收并排队前来的数据。任何情况下都不会产生ICMP错误包。
2、close():为对套接口的最后一次访问,则相应的名字信息及数据队列侍大都将被释放。closesocket()的语首谈樱义受SO_LINGER与SO_DONTLINGER选项影响。
三、特点不同
1、shutdown() :一个应用程序不应依赖于重用一个已被shutdown()禁止的套接口。特别地,一个WINDOWS套接口实现不必支持在这样的套接口上使用connect()调用。
2、close():如无错误发生,则closesocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程者丛序可通过WSAGetLastError()获取相应错误代码。
⑵ 在windows下用c语言如何实现socket网络编程,需要用到哪些头文件或者库
需要用到的头文件包含:
#include <winsock2.h>
#include <windows.h>
与linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库
Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:
Winsock 1:
Windows CE平台支持。
头文件:WinSock.h
库:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;
头文件:WinSock2.h
库:ws2_32.lib
mswsock.h用于编程扩展,使用时必须链接mswsock.dll
(2)socket编程函数扩展阅读
winsock库的加载与卸载:
加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加载成功,返回值为0。
WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~
LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。
卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。
⑶ socket编程到底是什么
socket 其实就是操作系统提供给程序员操作“网络协议栈”的接口,说人话就是,你能通过socket 的接口,来控制协议找工作,从而实现网络通信,达到跨主机通信。
协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。这里需要注意的是,服务端调用 accept 时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。
所以,监听的 socket 和真正用来传送数据的 socket,是“两个” socket,一个叫作监听 socket,一个叫作已完成连接 socket。成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。
⑷ C++的socket方法
C++中Socket方法主要用于网络通信,常用到的函数如下:
CSocket::Socket初始化
CSocket::SetSockOpt设置socket选项
CSocket::Bind绑定地址端口
CSocket::Connect连接
CSocket::Listen监听
CSocket::Accept接收外部连接的socket
CSocket::Send发送内容
CSocket::Receive接收内容
CSocket::Close关闭(不等于delete)
下面是C++编程下用Socket方法做一个客服端和服务端通信的案例:
1、服务端代码
//初始化Winscok
if(!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return1;
}
m_exit=false;
CServerDlg*aDlg=(CServerDlg*)lParam;
//获取端口
CStringstrPort;
aDlg->GetDlgItemText(IDC_EDIT_PORT,strPort);
UINTnPort=atoi(strPort);
//socket----创建2个socket--------------------------------------------
CSocketaSocket,serverSocket;
//最好不要使用aSocket.Create创建,因为容易会出现10048错误
if(!aSocket.Socket())
{
charszError[256]={0};
sprintf(szError,"CreateFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}
BOOLbOptVal=TRUE;
intbOptLen=sizeof(BOOL);
//设置Socket的选项,解决10048错误必须的步骤
aSocket.SetSockOpt(SO_REUSEADDR,(void*)&bOptVal,bOptLen,SOL_SOCKET);
//绑定
if(!aSocket.Bind(nPort))
{
charszError[256]={0};
sprintf(szError,"BindFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}
//监听
if(!aSocket.Listen(10))
{
charszError[256]={0};
sprintf(szError,"ListenFaild:%d",GetLastError());
AfxMessageBox(szError);
return1;
}
CStringstrText;
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+="服务已经开启! ";
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
while(!m_exit)
{
//接收外部连接
if(!aSocket.Accept(serverSocket))
{
continue;
}
else
{
charszRecvMsg[256]={0};
charszOutMsg[256]={0};
serverSocket.Receive(szRecvMsg,256);//接收客户端内容:阻塞
sprintf(szOutMsg,"接受到的参数是:%s ",szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+=szOutMsg;
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
serverSocket.Send("服务器已经收到,已经做出操作!",50);//发送内容给客户端
serverSocket.Close();//关闭
}
}
aSocket.Close();
serverSocket.Close();
aDlg->GetDlgItemText(IDC_EDIT_LOG,strText);
strText+="HaveClose!";
aDlg->SetDlgItemText(IDC_EDIT_LOG,strText);
return0;
2、客户端代码
//初始化CSocket对象,客户端可以是用Create因为客户端不需要绑定任何端口和地址,所以用默认参数即可
//连接指定的地址和端口是用函数Connect函数
//发送内容给服务器是用send函数
//接收服务端发送的内容使用Receive函数
AfxSocketInit();
CSocketaSocket;
CStringstrIP;
CStringstrPort;
CStringstrText;
this->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);
this->GetDlgItem(IDC_EDIT_PORT)->GetWindowText(strPort);
this->GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strText);
//初始化CSocket对象,因为客户端不需要绑定任何端口和地址,所以用默认参数即可
if(!aSocket.Create())
{
charszMsg[1024]={0};
sprintf(szMsg,"createfaild:%d",aSocket.GetLastError());
AfxMessageBox(szMsg);
return;
}
//转换需要连接的端口内容类型
intnPort=atoi(strPort);
//连接指定的地址和端口
if(aSocket.Connect(strIP,nPort))
{
charszRecValue[1024]={0};
aSocket.Send(strText,strText.GetLength());//发送内容给服务器
aSocket.Receive((void*)szRecValue,1024);//接收服务器发送回来的内容(该方法会阻塞,在此等待有内容接收到才继续向下执行)
AfxMessageBox(szRecValue);
}
else
{
charszMsg[1024]={0};
sprintf(szMsg,"createfaild:%d",aSocket.GetLastError());
AfxMessageBox(szMsg);
}
aSocket.Close();
⑸ socket编程中listen函数作用
socket编程中listen函数是用来侦听IP请求的。用来把其它主机的IP包传递接收过来。
⑹ 求MSDN中关于socket编程中的函数的参数介绍
哥们,网络,里面都有。
bind函数
bind函数用于将套接字绑定到一个已知的地址上。
语法:
int
bind
(
SOCKET
s,const
struct
sockaddr
FAR*
name,
int
namelen);
参数说明:
s:是一个套接字。
name:是一个sockaddr结构指针,该结构中包含了要结合的地址和端口号。
namelen:确定name缓冲区的长度。
返回值:如果函数执行成功,返回值为0,否则为SOCKET_ERROR。
在定义一个套接字后,需升扰氏要调用bind函数为其指定本机地址、协吵散议和端口号。
下面的代码创建一个套接字s,将其绑定到3010端口上。
int
port
=
3010;
SOCKET
s
=
socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
sockaddr_in
addr;
addr.sin_family
=
AF_INET;
//内部网络协议TCP\UDP等
addr.sin_port
=
htons(port);
//端口号
addr.sin_addr.s_addr
=
htonl(INADDR_ANY);
if
(SOCKET_ERROR
=
bind(s,(LPSOCKADDR)&addr,sizeof(addr))==0)
{
MessageBox("失败!");
}
listen在套接字函数中表示让一个套接字处于监听到来的连接请求的状态
功能:把一个李顷本地地址与套接字关联。
参数:
s
一个已绑定未被连接的套接字描述符
backlog
连接请求队列(queue
of
pending
connections)
的最大长度(一般由2到4)。用SOMAXCONN则由
系统确定。
返回值:
无错误,返回0,
否则,返回SOCKET
ERROR,可以调用函数WSAGetLastError取得错误代码。
⑺ c语言socket编程read()函数问题
write/read,是关于写特定的文件描述符使用的比较底层的系统调用,
sendto/recvfrom适用于用udp(数据包)方式的套接字中使用的,
其他的没见过,我是学linux编程的
Windows下的socket和Linux下的socket是不一样的,我没有查到sendmsg/recvmsg这个方法,上森脊面的链接是一个类似的函数,它和send/recv 的区别是,这个函数可以发送socket控制信息,看API就知道。
另外我也没有看到有write/read函数。 sendto/recvfrom用于UDP链此禅渗接,袭数send/recv用于TCP链接。
你列举的其余函数,我都没找到。下面的API地址供楼主查询验证。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms741692(v=vs.85).aspx
⑻ socket是什么呀
套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。
一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。
套接字是通信的基石,是支持TCP/IP协议的路通信的基本操作单元。
可以将套接字看作不同主机间的进程进行双间通信的端点,它构成了单个主机内及整个网络间的编程界面。套接字存在于通信域中,通信域是为了处理一般的线程通过套接字通信而引进的一种抽象概念。
套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序),各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。
Socket(套接字)可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连进程。
通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的 Socket中,该 Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的 Socket中,使对方能够接收到这段信息。
Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。
类型
1、数据报套接字
无连接套接字,使用用户数据报协议(UDP)。在数据报套接字上发送或接收的每个数据包都单独寻址和路由。数据报套接字不能保证顺序和可靠性,因此从一台机器或进程发送到另一台机器或进程的多个数据包可能以任何顺序到达或可能根本不到达。在数据报套接字上发送广播可能需要特殊配置。
为了接收广播数据包,数据报套接字不应该绑定到特定地址,尽管在某些实现中,当数据报套接字绑定到特定地址时也可能接收广播数据包。
2、流套接字
面向连接的套接字,使用传输控制协议(TCP)、流控制传输协议(SCTP) 或数据报拥塞控制协议(DCCP)。流套接字提供了无记录边界的有序且独特的无错误数据流,并具有用于创建和销毁连接以及报告错误的明确定义的机制。
流套接字以带外功能可靠地、有序地传输数据。在 Internet 上,流套接字通常使用 TCP 实现,以便应用程序可以使用 TCP/IP 协议在任何网络上运行。
3、原始套接字
允许直接发送和接收 IP 数据包,无需任何特定于协议的传输层格式。对于其他类型的套接字,根据选择的传输层协议(例如 TCP、UDP)自动封装有效载荷,并且套接字用户不知道与有效载荷一起广播的协议头的存在。从原始套接字读取时,通常包含标头。
从原始套接字传输数据包时,自动添加标头是可选的。
大多数套接字应用程序编程接口(API),例如基于Berkeley 套接字的那些,支持原始套接字。Windows XP于 2001 年发布,在Winsock接口中实现了原始套接字支持,但三年后,微软出于安全考虑限制了 Winsock 的原始套接字支持。
原始套接字用于与安全相关的应用程序,如Nmap。原始套接字的一个用例是在用户空间中实现新的传输层协议。
原始套接字通常在网络设备中可用,用于路由协议,例如Internet 组管理协议(IGMP) 和开放最短路径优先(OSPF),以及用于Internet 控制消息协议(ICMP) 等事情,由ping 实用程序。
以上内容参考网络-套接字