问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Winsock编程基础白痴问题!

发布网友 发布时间:2022-05-12 07:30

我来回答

3个回答

热心网友 时间:2023-08-01 00:03

BSD 函式包括:
accept() bind() closesocket() connect()
getpeername() getsockname() getsockopt() htonl()
htons() inet_addr() inet_ntoa() ioctlsocket()
listen() ntohl() ntohs() recv()
recvfrom() select() send() sendto()
setsockopt() shutdown() socket() gethostname()
gethostbyaddr() gethostbyname()
getprotobyname() getprotobynumber()
getservbyname() getservbyport()

Microsoft html" class="UBBWordLink">Windows-specific Extensions 函式包括:
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()

这些 API 介面适用於 Internet Protocol Suite (IPS,通常称之为 TCP/IP),
支援 Stream (TCP) 及 Datagram (UDP) Socket。

Stream (TCP) Socket 提供「双向」、「可靠」、「有次序」、「不重覆」之资料传送。
Datagram (UDP) Socket 则提供「双向」之沟通,但没有「可靠」、「有次序」、「不重覆」等之保证; 所以使用者可能会收到无次序、重覆之资料,甚至资料在传输过程中也可能会遗漏。

[Blocking 与 Non-blocking 模式]

Blocking 模式:使用者呼叫此一模式之函式时,会进入此函式之内部,直到条件或资料完全符合时再回到呼叫点。

Non-blocking 模式:使用者呼叫此一模式之函式时,进入此函式之内部,依当时之条件或资料做适当之回覆,并不会停留在函式之内部到条件或资料完全符合后才回应。

使用者必需注意的是,html" class="UBBWordLink">WINSOCK 定义之 Blocking 模式与一般 Unix 的不太相同。html" class="UBBWordLink">WINSOCK定义允许应用程式在呼叫 Blocking 函式的同时,依旧能够处理其它讯息 (Messages),包括Keyboard 及 Mouse 的事件;但是此时应用程式除了能用 WSACancelBlockingCall() 函式来取消原先之 locking 动作或用WSAIsBlocking() 函式来检查目前是否有 Blocking 动作仍在进行外,不可以」在原先呼叫之Blocking 函式完成前再呼叫其它的 Socket 函式,不然后者会失败且产生WSAINPROGRESS 的错误。

使用者呼叫 WSACancelBlockingCall()函式所取消的 Blocking 动作若不是accept() 或者 select()的话,那麽之后唯一可呼叫的 Socket 函式只有closesocket(),因为取消一个 Socket 的Blocking 动作会使其变成未定(Indeterminate) 状态。

[Async (非同步) 模式]

使用者呼叫此一模式的函式时,并不会马上得到要求的资料;而是当要求的动作完成后,系统再透过另一种方式来通知呼叫者。其好处是使用者不需等到答覆后才可以再做其它的动作或要求。
html" class="UBBWordLink">WINSOCK定义的 Async 模式是以「PostMessage」的方式告知使用者其要求已经完成;所以在呼叫此类函式时,必须告知 html" class="UBBWordLink">Windows Sockets DLL一些资讯,包括接受讯息的视窗 handle及讯息编号等。

[函式概说]

[BSD Socket 程式库]

(1) accept():接受某一Socket的连接要求,以完成 Stream Socket 的连接。

格 式: SOCKET PASCAL FAR accept( SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen );
参 数: s Socket的识别码 addr 存放来连接的彼端的位址 addrlen addr的长度
传回值: 成功 - 新的Socket识别码 失败 - INVALID_SOCKET (呼叫 WSAGetLastError() 可得知原因)
说明: Server 端之应用程式呼叫此一函式来接受 Client 端要求之Socket 连接动作;如果Server 端之 Socket 是为 Blocking 模式,且没有人要求连接动作,那麽此一函式会Block 函式马上回覆错误。accept() 函式的答覆值为一新的 Socket,此 Socket 不可再用来接受其它的连接要求;但是原先之 Socket 仍可接受其他人的连接要求。

(2) bind():指定 Socket 的 Local 位址 (Address)。
格 式: int PASCAL FAR bind( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket的识别码 name Socket的位址值,其格式为
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
namelen name的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)

说明: 此一函式是指定 Local 位址及 Port 给某一未定名之 Socket。 使用者若不在意位址或 Port 的值,那麽他可以设定位址为 INADDR_ANY,及Port 为 0;那麽html" class="UBBWordLink">Windows Sockets 会自动将其设定适当之位址及 Port(1024 到 5000之间的值),使用者可以在此 Socket 真正连接完成后,呼叫 getsockname() 来获知其被设定的值。

(3) closesocket():关闭某一Socket。
格 式: int PASCAL FAR closesocket( SOCKET s );
参 数: s Socket 的识别码
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此一函式是用来关闭某一 Socket。
若是使用者原先对要关闭之 Socket 设定 SO_DONTLINGER,则在呼叫此一函式后,会马上回覆,但是此一 Sokcet 尚未传送完毕的资料会继续送完后才关闭。
若是使用者原先设定此 Socket 为 SO_LINGER,则有两种情况:
(a) Timeout 设为 0 的话,此一 Socket 马上重新设定 (reset),未传完或未收到的资料全部遗失。
(b) Timeout 不为 0 的话,则会将资料送完,或是等到 Timeout 发生后才关闭。

(4) connect():要求连接某一Socket到指定的对方。
格 式: int PASCAL FAR connect( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket 的识别码
name 此 Socket 想要连接的对方位址
namelen name的长度
传回值:成功 - 0
失败 - SOCKET_ERROR (呼叫WSAGetLastError()可得知原因)
说明: 此函式用来向对方要求建立连接。若是指定的对方位址为 0 的话,会传回错误值。当连接建立完成后,使用者即可利用此一 Socket 来做传送或接收资料之用了。

(5) getpeername():获取已连接成功之 Socket 的对方位址。
格 式: int PASCAL FAR getpeername( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参 数: s Socket 的识别码
name 此 Socket 连接的对方位址
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。

(6) getsockname():获取 Socket 的 Local 位址资料。
格式: int PASCAL FAR getsockname( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参数: s Socket 的识别码
name 此 Socket 的 Local 位址
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式是用来取得已设定位址或已连接之 Socket 的本端位址资料。若是此 Socket 被设定为 INADDR_ANY,则需等真正建立连接成功后才会传回正确的位址。

(7) getsockopt():要求某一 Socket 目前状态设定的资料。
格式: int PASCAL FAR getsockopt( SOCKET s,int level,int optname,char FAR *optval,int FAR *optlen );
参数: s= Socket的识别码,level=选项设定的,level=optname 选项名称,optval=选项的设定值,optlen=选项设定值的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式用来获取目前 Socket的某些状态设定值。 html" class="UBBWordLink">WINSOCK 提供之 level 只有 SOL_SOCKET 及 IPPROTO_TCP optname则有以下 之选择:(参见html" class="UBBWordLink">WINSOCK 第 29、30 页之定义)
Value Type
-----------------------------------------------
SO_ACCEPTCONN BOOL
SO_BROADCAST BOOL
*SO_DEBUG BOOL
SO_DONTLINGER BOOL
*SO_DONTROUTE BOOL
*SO_ERROR int
*SO_KEEPALIVE BOOL
SO_LINGER struct linger FAR*
SO_OOBINLINE BOOL
*SO_RCVBUF int
SO_REUSEADDR BOOL
*SO_SNDBUF int
SO_TYPE int
TCP_NODELAY BOOL
(* 表示暂不提供此功能选项)

(8) htonl():将一 32 位元 u_long 的值由 host 的排列方式转换成network 的排列方式。
格式: u_long PASCAL FAR htonl( u_long hostlong );
参数: hostlong 一个 32 位元 host 排列方式的数目
传回值: 一个 32 位元 network 排列方式的数目
说明: 因为 network 的排列方式与 host 的排列方式可能不同,所以我们需要此一函式来做转换。

(9) htons():将一 16 位元u_short 的值由 host 的排列方式转换成network 的排列方式。
格 式: u_short PASCAL FAR htons( u_short hostshort );
参 数: hostshort 一个 16 位元 host 排列方式的数目
传回值: 一个 16 位元 network 排列方式的数目
说明: 因为 network 的排列方式与 host 的排列方式可能不同,所以我们需要此一函式来做转换。

(10) inet_addr():将字串格式的位址转换成 32 位元 unsigned long 的格式。
格式: unsigned long PASCAL FAR inet_addr( const char FAR *cp );
参数: cp 一个代表位址的「点格式」(dotted) 字串
传回值: 成功 - 一个代表 Internet 位址的 unsigned long
失败 - INADDR_NONE
说明: 此函式将一「点格式」的位址字串转换成适用之Intenet位址。
「点格式」字串可为以下四种方式之任一:
(i) a.b.c.d (ii) a.b.c (iii) a.b (iv) a

热心网友 时间:2023-08-01 00:03

BSD 函式包括:
accept() bind() closesocket() connect()
getpeername() getsockname() getsockopt() htonl()
htons() inet_addr() inet_ntoa() ioctlsocket()
listen() ntohl() ntohs() recv()
recvfrom() select() send() sendto()
setsockopt() shutdown() socket() gethostname()
gethostbyaddr() gethostbyname()
getprotobyname() getprotobynumber()
getservbyname() getservbyport()

Microsoft html" class="UBBWordLink">Windows-specific Extensions 函式包括:
WSAAsyncGetHostByAddr() WSAAsyncGetHostByName()
WSAAsyncGetProtoByName() WSAAsyncGetProtoByNumber()
WSAAsyncGetServByName() WSAAsyncGetServByPort()
WSAAsyncSelect() WSACancelAsyncRequest()
WSACancelBlockingCall() WSACleanup()
WSAGetLastError() WSAIsBlocking()
WSASetBlockingHook() WSASetLastError()
WSAStartup() WSAUnhookBlockingHook()

这些 API 介面适用於 Internet Protocol Suite (IPS,通常称之为 TCP/IP),
支援 Stream (TCP) 及 Datagram (UDP) Socket。

Stream (TCP) Socket 提供「双向」、「可靠」、「有次序」、「不重覆」之资料传送。
Datagram (UDP) Socket 则提供「双向」之沟通,但没有「可靠」、「有次序」、「不重覆」等之保证; 所以使用者可能会收到无次序、重覆之资料,甚至资料在传输过程中也可能会遗漏。

[Blocking 与 Non-blocking 模式]

Blocking 模式:使用者呼叫此一模式之函式时,会进入此函式之内部,直到条件或资料完全符合时再回到呼叫点。

Non-blocking 模式:使用者呼叫此一模式之函式时,进入此函式之内部,依当时之条件或资料做适当之回覆,并不会停留在函式之内部到条件或资料完全符合后才回应。

使用者必需注意的是,html" class="UBBWordLink">WINSOCK 定义之 Blocking 模式与一般 Unix 的不太相同。html" class="UBBWordLink">WINSOCK定义允许应用程式在呼叫 Blocking 函式的同时,依旧能够处理其它讯息 (Messages),包括Keyboard 及 Mouse 的事件;但是此时应用程式除了能用 WSACancelBlockingCall() 函式来取消原先之 locking 动作或用WSAIsBlocking() 函式来检查目前是否有 Blocking 动作仍在进行外,不可以」在原先呼叫之Blocking 函式完成前再呼叫其它的 Socket 函式,不然后者会失败且产生WSAINPROGRESS 的错误。

使用者呼叫 WSACancelBlockingCall()函式所取消的 Blocking 动作若不是accept() 或者 select()的话,那麽之后唯一可呼叫的 Socket 函式只有closesocket(),因为取消一个 Socket 的Blocking 动作会使其变成未定(Indeterminate) 状态。

[Async (非同步) 模式]

使用者呼叫此一模式的函式时,并不会马上得到要求的资料;而是当要求的动作完成后,系统再透过另一种方式来通知呼叫者。其好处是使用者不需等到答覆后才可以再做其它的动作或要求。
html" class="UBBWordLink">WINSOCK定义的 Async 模式是以「PostMessage」的方式告知使用者其要求已经完成;所以在呼叫此类函式时,必须告知 html" class="UBBWordLink">Windows Sockets DLL一些资讯,包括接受讯息的视窗 handle及讯息编号等。

[函式概说]

[BSD Socket 程式库]

(1) accept():接受某一Socket的连接要求,以完成 Stream Socket 的连接。

格 式: SOCKET PASCAL FAR accept( SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen );
参 数: s Socket的识别码 addr 存放来连接的彼端的位址 addrlen addr的长度
传回值: 成功 - 新的Socket识别码 失败 - INVALID_SOCKET (呼叫 WSAGetLastError() 可得知原因)
说明: Server 端之应用程式呼叫此一函式来接受 Client 端要求之Socket 连接动作;如果Server 端之 Socket 是为 Blocking 模式,且没有人要求连接动作,那麽此一函式会Block 函式马上回覆错误。accept() 函式的答覆值为一新的 Socket,此 Socket 不可再用来接受其它的连接要求;但是原先之 Socket 仍可接受其他人的连接要求。

(2) bind():指定 Socket 的 Local 位址 (Address)。
格 式: int PASCAL FAR bind( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket的识别码 name Socket的位址值,其格式为
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
namelen name的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)

说明: 此一函式是指定 Local 位址及 Port 给某一未定名之 Socket。 使用者若不在意位址或 Port 的值,那麽他可以设定位址为 INADDR_ANY,及Port 为 0;那麽html" class="UBBWordLink">Windows Sockets 会自动将其设定适当之位址及 Port(1024 到 5000之间的值),使用者可以在此 Socket 真正连接完成后,呼叫 getsockname() 来获知其被设定的值。

(3) closesocket():关闭某一Socket。
格 式: int PASCAL FAR closesocket( SOCKET s );
参 数: s Socket 的识别码
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此一函式是用来关闭某一 Socket。
若是使用者原先对要关闭之 Socket 设定 SO_DONTLINGER,则在呼叫此一函式后,会马上回覆,但是此一 Sokcet 尚未传送完毕的资料会继续送完后才关闭。
若是使用者原先设定此 Socket 为 SO_LINGER,则有两种情况:
(a) Timeout 设为 0 的话,此一 Socket 马上重新设定 (reset),未传完或未收到的资料全部遗失。
(b) Timeout 不为 0 的话,则会将资料送完,或是等到 Timeout 发生后才关闭。

(4) connect():要求连接某一Socket到指定的对方。
格 式: int PASCAL FAR connect( SOCKET s,const struct sockaddr FAR *name,int namelen );
参 数: s Socket 的识别码
name 此 Socket 想要连接的对方位址
namelen name的长度
传回值:成功 - 0
失败 - SOCKET_ERROR (呼叫WSAGetLastError()可得知原因)
说明: 此函式用来向对方要求建立连接。若是指定的对方位址为 0 的话,会传回错误值。当连接建立完成后,使用者即可利用此一 Socket 来做传送或接收资料之用了。

(5) getpeername():获取已连接成功之 Socket 的对方位址。
格 式: int PASCAL FAR getpeername( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参 数: s Socket 的识别码
name 此 Socket 连接的对方位址
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式可用来取得已连接成功的 Socket 的彼端之位址资料。

(6) getsockname():获取 Socket 的 Local 位址资料。
格式: int PASCAL FAR getsockname( SOCKET s,struct sockaddr FAR *name,int FAR *namelen );
参数: s Socket 的识别码
name 此 Socket 的 Local 位址
namelen name 的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式是用来取得已设定位址或已连接之 Socket 的本端位址资料。若是此 Socket 被设定为 INADDR_ANY,则需等真正建立连接成功后才会传回正确的位址。

(7) getsockopt():要求某一 Socket 目前状态设定的资料。
格式: int PASCAL FAR getsockopt( SOCKET s,int level,int optname,char FAR *optval,int FAR *optlen );
参数: s= Socket的识别码,level=选项设定的,level=optname 选项名称,optval=选项的设定值,optlen=选项设定值的长度
传回值: 成功 - 0
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)
说明: 此函式用来获取目前 Socket的某些状态设定值。 html" class="UBBWordLink">WINSOCK 提供之 level 只有 SOL_SOCKET 及 IPPROTO_TCP optname则有以下 之选择:(参见html" class="UBBWordLink">WINSOCK 第 29、30 页之定义)
Value Type
-----------------------------------------------
SO_ACCEPTCONN BOOL
SO_BROADCAST BOOL
*SO_DEBUG BOOL
SO_DONTLINGER BOOL
*SO_DONTROUTE BOOL
*SO_ERROR int
*SO_KEEPALIVE BOOL
SO_LINGER struct linger FAR*
SO_OOBINLINE BOOL
*SO_RCVBUF int
SO_REUSEADDR BOOL
*SO_SNDBUF int
SO_TYPE int
TCP_NODELAY BOOL
(* 表示暂不提供此功能选项)

(8) htonl():将一 32 位元 u_long 的值由 host 的排列方式转换成network 的排列方式。
格式: u_long PASCAL FAR htonl( u_long hostlong );
参数: hostlong 一个 32 位元 host 排列方式的数目
传回值: 一个 32 位元 network 排列方式的数目
说明: 因为 network 的排列方式与 host 的排列方式可能不同,所以我们需要此一函式来做转换。

(9) htons():将一 16 位元u_short 的值由 host 的排列方式转换成network 的排列方式。
格 式: u_short PASCAL FAR htons( u_short hostshort );
参 数: hostshort 一个 16 位元 host 排列方式的数目
传回值: 一个 16 位元 network 排列方式的数目
说明: 因为 network 的排列方式与 host 的排列方式可能不同,所以我们需要此一函式来做转换。

(10) inet_addr():将字串格式的位址转换成 32 位元 unsigned long 的格式。
格式: unsigned long PASCAL FAR inet_addr( const char FAR *cp );
参数: cp 一个代表位址的「点格式」(dotted) 字串
传回值: 成功 - 一个代表 Internet 位址的 unsigned long
失败 - INADDR_NONE
说明: 此函式将一「点格式」的位址字串转换成适用之Intenet位址。

热心网友 时间:2023-08-01 00:04

你的服务器可以只做一件事请,就是等待客户机的连接,然后处理。
也可以把待等待客户机连接做为一个小的事情处理,在没有客户机连接的时候,做其它的一些事情,单纯的理解服务器和客户机,也就是你说那个意思了。
用VC++编程看你是做什么用,有界面的和没界面的是不一样的。追问没界面的!就是打入代码直接可以使用的! CMD窗口的那种!
要建立C++里面哪个工程!具体指出来!今天敲了一些代码!编译都通不过!

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
提成点数怎么算公式 Huamei/华美每日粗粮粗纤维饼-适用对象 0pp01107格式化后成白屏且不能开机怎么办 五邑大学是市属还是省属 五邑大学校区有几个 窝瓜焖荷包蛋怎么做? 达科塔·芬妮简要生平 湖北自动冷库多少钱 虹口区海洛斯精密空调 ...回事联想电脑为什么一接通电源自己就自动开机了 以太网数据帧的监听与分析 getservbyname()的返回值 想开一家经营化学试剂的商店,办理个体工商户登记可以吗? 本人刚进入化学试剂销售行业,想知道做化学试剂销售工作是否有前途? 个人爱好,自己做一些化学实验有什么要求?化学试剂好买吗? 一封关于在学校喝酒的检讨书 私人零售化学试剂可以吗? 学生会要求写一封关于喝酒的检讨书怎么 沈彦霖2021年6月6号上午9:15在五行属中缺什么? 和恐高症的人一起坐过山车是什么体验? 过山车作文 化学试剂对身体的影响严重吗? 2020年1月6日二十三点八分男孩出生的五行属性命理? 饮酒 是谁写得书? 过山车的时候是喊出来好还是不喊出来好 我是1993年1月6号出生的属鸡五行里缺什么 你第一次做过山车是什么心情? 请问大师2013年1月6日辰时出生的八字是什么,五行缺什么,很急!谢谢。男孩 2017年1月6号14点14出生孩子的八字是什么,缺什么? 2020年1月6日14:56生的女孩 五行缺什么? 各位大虾帮我一下吧!翻译这段代码 vb在模块里如何使用WINSOCK控件传输文件?没有窗体 Ultraedit 里面,如何让Perl的关键词高亮啊 无法定位程序输入点WSAWaitformultipleevents于动态链接库WS2_32.dll Ws2_32.lib是做什么用的? 变压器做变压比是怎么做的 数据多少才是正常的呢? 变压器的电流比和电压比 妈妈|700字优秀作文(带小标题) 变压器的变压比用哪个字母来表示( )? 变压比什么意思 为什么说变压器的变压比会随着输入信号频率的增加而增加? 作文 致妈妈700字以第二人称来写 关于妈妈的作文700字 要求写一件事 关于母爱作文700字,不少于3种修辞手法的 生物制品 生化药品 疫苗是否需要向药监局申请销毁 雷达机械部分旋转的原理是什么? 24口交换机可以带几个信息插座 响应式布局是怎么回事 只能用html5跟css3写代码吗 能用html跟css写吗 我单位有一批过期的化妆品该怎么处理,上海这边有专门的环保销毁单位吗? 雷达波形图怎么看