c socket C++的socket方法
各位老铁们,大家好,今天由我来为大家分享c socket,以及C++的socket方法的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!
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+="服务已经开启!\r\n";
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\r\n",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();
c语言中关于socket函数的例子
函数说明:socket()用来建立一个新的socket,也就是向系统注册,通知系统建立一通信端口.参数domain指定使用何种的地址类型,完整的定义在/usr/include/bits/socket.h内,底下是常见的协议:
PF_UNIX/PF_LOCAL/AF_UNIX/AF_LOCAL UNIX进程通信协议
PF_INET?AF_INET Ipv4网络协议
PF_INET6/AF_INET6 Ipv6网络协议
PF_IPX/AF_IPX IPX-Novell协议
PF_NETLINK/AF_NETLINK核心用户接口装置
PF_X25/AF_X25 ITU-T X. 25/ISO-8208协议
PF_AX25/AF_AX25业余无线AX. 25协议
PF_ATMPVC/AF_ATMPVC存取原始 ATM PVCs
PF_APPLETALK/AF_APPLETALK appletalk(DDP)协议
PF_PACKET/AF_PACKET初级封包接口
参数 type有下列几种数值:
1、SOCK_STREAM提供双向连续且可信赖的数据流,即TCP.支持 OOB机制,在所有数据传送前必须使用connect()来建立连线状态.
2、SOCK_DGRAM使用不连续不可信赖的数据包连接
3、SOCK_SEQPACKET提供连续可信赖的数据包连接
4、SOCK_RAW提供原始网络协议存取
5、SOCK_RDM提供可信赖的数据包连接
6、SOCK_PACKET提供和网络驱动程序直接通信. protocol用来指定socket所使用的传输协议编号,通常此参考不用管它,设为0即可.
返回值:成功则返回socket处理代码,失败返回-1.
错误代码:
1、EPROTONOSUPPORT参数domain指定的类型不支持参数type或protocol指定的协议
2、ENFILE核心内存不足,无法建立新的socket结构
3、EMFILE进程文件表溢出,无法再建立新的socket
4、EACCESS权限不足,无法建立type或protocol指定的协议
5、ENOBUFS/ENOMEM内存不足
6、EINVAL参数domain/type/protocol不合法
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实用程序。
以上内容参考百度百科-套接字
关于c socket,C++的socket方法的介绍到此结束,希望对大家有所帮助。