关于socket通讯与防火墙的问题

关于socket通讯与防火墙的问题,第1张

qq是你主动连接出去,防火墙能自己侦测到这个请求,一般会主动问你要不要开放这个端口。

而你做的程序中有一个要作为服务器接收外来连接, 从安全角度出发防火墙一般默认把外部连接拒绝,需要用户主动去设置开放的端口。但也有那种会自动检测服务程序开放端口的防火墙,这种情况下也会提示用户是否开放这个端口。

这种安全措施很正常,安全与方便有时是矛盾的,看你自己选了。

1.简单服务器

/*

#include <winsock2.h>

#pragma comment(lib,"WS2_32.lib")

*/

WSADATA wsd

static UINT port=%%1

UINT Listen(LPVOID pParam)

{

SOCKET sServer,sClient

char buf[1024]

int retVal

if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)

{

return -1//失败

}

sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

if(INVALID_SOCKET==sServer)

{

WSACleanup()

return -1//创建套接字失败

}

SOCKADDR_IN addrServ

addrServ.sin_family=AF_INET

addrServ.sin_port=htons((short)pParam)

addrServ.sin_addr.s_addr=INADDR_ANY

retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN))

if(SOCKET_ERROR==retVal)

{

closesocket(sServer)

WSACleanup()

return -1//绑定套接字失败

}

retVal=listen(sServer,1)

if(SOCKET_ERROR==retVal)

{

closesocket(sServer)

WSACleanup()

return -1//开始监听失败

}

sockaddr_in addrClient

int addrClientlen=sizeof(addrClient)

sClient=accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen)

if(INVALID_SOCKET==sClient)

{

closesocket(sServer)

WSACleanup()

return -1//开始接受客户端连接失败

}

ZeroMemory(buf,sizeof(buf))

retVal=recv(sClient,buf,sizeof(buf),0)

if(SOCKET_ERROR==retVal)

{

closesocket(sServer)

closesocket(sClient)

WSACleanup()

return -1//接收数据失败

}

CString %%2(buf)

closesocket(sServer)

closesocket(sClient)

WSACleanup()

return 0

}

CWinThread *pThread=AfxBeginThread(Listen,&port)

2.简单客户端

/*

#include <winsock2.h>

#pragma comment(lib,"WS2_32.lib")

*/

WSADATA wsd

SOCKET sHost

SOCKADDR_IN servAddr

char buf[1024]

int retVal

if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)

{

return -1//失败

}

sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)

if(INVALID_SOCKET==sHost)

{

WSACleanup()

return -1//创建套接字失败

}

servAddr.sin_family=AF_INET

servAddr.sin_addr.s_addr=inet_addr(%%3)

servAddr.sin_port=htons((short)%%2)

int nServAddlen=sizeof(servAddr)

retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr))

if(SOCKET_ERROR==retVal) {

closesocket(sHost)

WSACleanup()

return -1//连接服务器失败

}

ZeroMemory(buf,sizeof(buf))

strcpy(buf,%%3)

retVal=send(sHost,buf,sizeof(buf),0)

if(SOCKET_ERROR==retVal)

{

closesocket(sHost)

WSACleanup()

return -1//向服务器发送数据失败

}

closesocket(sHost)

WSACleanup()

3.获得本机IP

/*

#include <winsock2.h>

#pragma comment(lib,"WS2_32.lib")

*/

WSADATA wsd

if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)

{

return -1//失败

}

char szHostname[100],szHostaddress[200]

if(gethostname(szHostname,sizeof(szHostname))!=SOCKET_ERROR)

{

HOSTENT *pHostEnt=gethostbyname(szHostname)

if(pHostEnt!=NULL){

sprintf(szHostaddress,"%d.%d.%d.%d",

( pHostEnt->h_addr_list[0][0]&0x00ff ),

( pHostEnt->h_addr_list[0][1]&0x00ff ),

( pHostEnt->h_addr_list[0][2]&0x00ff ),

( pHostEnt->h_addr_list[0][3]&0x00ff ))

}

}

else

return

CString %%1(szHostaddress)

套接字(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 实用程序。

以上内容参考 百度百科-套接字


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/758621.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-08-18
下一篇2023-08-18

发表评论

登录后才能评论

评论列表(0条)

    保存