我出的网络中的一些题目。

sevencat 2003-11-13 07:52:37
1、win与LINUX下的套接字的数据类型是不是一样的?(不要告诉我一个是SOCKET,一个是int,所以不一样)
2、WIN系统下面最多可以有多少个套接字?
3、为什么socket的第三个参数(协议参数)有人设定为0?
4、connect是TCP用的吧,我可不可以将他用到UDP上,这样做有没有意义?
5、同一个程序中,我因为程序中的BUG,两次调用了bind函数,绑定的同一个IP地址和端口号,但是我在绑定前都设置了REUSEADDR选项,这样做会不会报错,假如会报错的话,在哪里会报错,是BIND的时候,还是ACCEPT的时候,假如不会报错。客户端去连的时候哪个SOCKET能ACCEPT到?
6、connect的时候对方服务器有套接字在监听,但是没有accept,这种情况下connect过程经过了几次交换包?什么时候会返回?
7、connect会堵塞,你一般用什么方法来防止堵塞?
8、堵塞套接字中的recv假如想读1000个字节,但现在一开始只读了100个,他是立即返回还是继续等待到1000个字节全读完再返回?
9、堵塞套接字中的send假如想发送1000个字节,但现在一开始只发了100个,他是现在就返回,还是等待继续发送,直到发完或出错再返回?
10、一个套接字关闭后经常会有一个TIME_WAIT状态,这种状态有什么用,假如想防止他的话,用什么办法,这种办法对最后的交换包有什么影响?
11、closesocket和shutdown会堵塞吗?
12、客户端程序崩溃的时候一般会不会向服务器发包,假如会的话,发的是什么包?
13、客户机网线突然掉了,服务器能不能立即知道(服务器当时没有读的动作),假如不能的话,你用什么办法来得知?
14、UDP服务器中,假如有session data的话,你在recvfrom的时候如何得到这个session data的指针?
15、Keepalive和自己发送存活包哪种方法更有效?
16、listen的第二个参数究竟有什么作用?
17、select大概1000个读套接字的话,每次查找一个套接字是否处于可读大概需要多长时间?
18、完成端口中你是怎么样实行完美关闭的?
19、流量控制你是怎么做的?
20、发往127.0.0.1的包经过网卡发送吗?
...全文
243 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
elssann 2004-02-04
  • 打赏
  • 举报
回复
5、同一个程序中,我因为程序中的BUG,两次调用了bind函数,绑定的同一个IP地址和端口号,但是我在绑定前都设置了REUSEADDR选项,这样做会不会报错,假如会报错的话,在哪里会报错,是BIND的时候,还是ACCEPT的时候,假如不会报错。客户端去连的时候哪个SOCKET能ACCEPT到?


===========================================================
使用了REUSEADDR选峡谷内,后bind的那个SOCKET接受ACCEPT,然后可以通过127.0.0.1把数据交给先bind的那个套接字。也可以把这个包截获下来。从编程的安全上来将,最好把服务器监听套接字都设置SO_EXCLUSIVEADDRUSE选项。
syl5005 2004-02-04
  • 打赏
  • 举报
回复
好问题,我一个也不会回答。
vtable9999 2004-02-01
  • 打赏
  • 举报
回复
虽然已经结帐了,还是要回答一下,算是对自己几年学习的一次考测吧
--------------------------------------------------------------

1、win与LINUX下的套接字的数据类型是不是一样的?(不要告诉我一个是SOCKET,一个是int,所以不一样)
一样的,都是INT类型

2、WIN系统下面最多可以有多少个套接字?
65535吧

3、为什么socket的第三个参数(协议参数)有人设定为0?
我一就写0,默认就是0吧

4、connect是TCP用的吧,我可不可以将他用到UDP上,这样做有没有意义?
有一点用,这样可以产生一个FD_CONNECT事件

5、同一个程序中,我因为程序中的BUG,两次调用了bind函数,绑定的同一个IP地址和端口号,但是我在绑定前都设置了REUSEADDR选项,这样做会不会报错,假如会报错的话,在哪里会报错,是BIND的时候,还是ACCEPT的时候,假如不会报错。客户端去连的时候哪个SOCKET能ACCEPT到?
没试过,不知道。

6、connect的时候对方服务器有套接字在监听,但是没有accept,这种情况下connect过程经过了几次交换包?什么时候会返回?
3次完整的握手过程。因为accept只是获取一个系统已经建立好的TCP连接,用户是无法控制握手过程的。

7、connect会堵塞,你一般用什么方法来防止堵塞?
把socket设置为非阻塞类型

8、堵塞套接字中的recv假如想读1000个字节,但现在一开始只读了100个,他是立即返回还是继续等待到1000个字节全读完再返回?
立即返回

9、堵塞套接字中的send假如想发送1000个字节,但现在一开始只发了100个,他是现在就返回,还是等待继续发送,直到发完或出错再返回?
等待发送完成直到出错

10、一个套接字关闭后经常会有一个TIME_WAIT状态,这种状态有什么用,假如想防止他的话,用什么办法,这种办法对最后的交换包有什么影响?
执行主动关闭的socket会进入TIME_WAIT状态,该状态用于防止同一插口对上一次老的连接延迟的数据包被新的连接误接收。
防止这一状态只有socket的执行被动关闭才行吧,还有别的办法吗?请高人赐教!

11、closesocket和shutdown会堵塞吗?
closesocket发送RST包,不会阻塞。shutdown是发送FIN包的,应该会阻塞

12、客户端程序崩溃的时候一般会不会向服务器发包,假如会的话,发的是什么包?
这时如果服务器有数据过来,会返回一个RST包

13、客户机网线突然掉了,服务器能不能立即知道(服务器当时没有读的动作),假如不能的话,你用什么办法来得知?
不知道。可以的办法是服务器向客户机发送查询包,规定的时间内没有应答是客户机已经当掉。
另:这个题目是否有些问题?这种情况即时服务器进行读取操作也无法确认客户机是否当掉吧

14、UDP服务器中,假如有session data的话,你在recvfrom的时候如何得到这个session data的指针?
不知道session data是什么。

15、Keepalive和自己发送存活包哪种方法更有效?
当然是自己发送好一些。RFC规定的KeepAlive一般是2小时,且无法设置keepalive周期, 这对于大多数应用来
说是不合适的。

16、listen的第二个参数究竟有什么作用?
接受队列的最大数目

17、select大概1000个读套接字的话,每次查找一个套接字是否处于可读大概需要多长时间?
不知道。不过我记得WSASelect最大只能64个socket, select可以这么多么?

18、完成端口中你是怎么样实行完美关闭的?
不清楚

19、流量控制你是怎么做的?
如果是TCP的话,有必要自己做流量控制吗?

20、发往127.0.0.1的包经过网卡发送吗?
不经过,在IP层直接返回了

21、TCP中的send成功能不能保证这些数据已经发出网卡,或者已发出网卡,但未收到对方的回复?
分情况,如果是阻塞socket应该是对的,而非阻塞socket send成功只表明数据从用户层复制到
系统核心层。

22、发一个SYN包给监听服务器端口后,不再发包给他了,这种情况造成什么样的后果?
服务器端口等待ACK包,但在75秒后(好像是)会结束

23、发一个FIN包给一台机器的时候。
假如正好发到了他的监听端口上,会出现什么后果?
假如发到了未监听端口中,会收到什么样的包?
假如发到监听端口中,如果系列号不对则服务器不响应,如果系统号是对的,则进入正常流程
假如发到未监听端口,服务器返回RST包

24、RST包一般什么时候会收到?
1、端口没有侦听
2、标志位含有RST
也有还有。请谁补充一下

25、怎么做才能基本确保我的包不会被分片?为什么?
TCP不用处理就可以保证不会分包
UDP每次发送的包大小小于MTU即可
kangfx 2004-01-09
  • 打赏
  • 举报
回复
mark
ykj76 2004-01-05
  • 打赏
  • 举报
回复
up
poseidonliu 2004-01-05
  • 打赏
  • 举报
回复
mark
sevencat 2004-01-02
  • 打赏
  • 举报
回复
假如在一个函数里面使用的话,编译器应该能保证他在函数结束的时候清除吧。
guonix 2004-01-02
  • 打赏
  • 举报
回复
to sevencat(七猫):

关于LOCK, 最好不要那么做, 明确的写出Enter与Leave比较好. 析构函数是不可靠的, 因为它依赖的是编译器, 你并不知道什么时候才真正Leave.
guonix 2004-01-02
  • 打赏
  • 举报
回复
1、win与LINUX下的套接字的数据类型是不是一样的?(不要告诉我一个是SOCKET,一个是int,所以不一样)
一样的, 无容置疑.

2、WIN系统下面最多可以有多少个套接字?
据说是65535, 而且我一直按这个数值去做的, 汗...

3、为什么socket的第三个参数(协议参数)有人设定为0?
TCP, UDP等都可以设为0.

4、connect是TCP用的吧,我可不可以将他用到UDP上,这样做有没有意义?
有意义, 在许多异步程序中, 在发送或接受时并不知道目标的地址, connect后在发送与接受时就不用写地址了.

5、同一个程序中,我因为程序中的BUG,两次调用了bind函数,绑定的同一个IP地址和端口号,但是我在绑定前都设置了REUSEADDR选项,这样做会不会报错,假如会报错的话,在哪里会报错,是BIND的时候,还是ACCEPT的时候,假如不会报错。客户端去连的时候哪个SOCKET能ACCEPT到?
没用过REUSEADDR选项, 汗...

6、connect的时候对方服务器有套接字在监听,但是没有accept,这种情况下connect过程经过了几次交换包?什么时候会返回?
是三次吗? 汗... 查一下书才能记起来.

7、connect会堵塞,你一般用什么方法来防止堵塞?
ioctlsocket就行了

8、堵塞套接字中的recv假如想读1000个字节,但现在一开始只读了100个,他是立即返回还是继续等待到1000个字节全读完再返回?
立即返回.

9、堵塞套接字中的send假如想发送1000个字节,但现在一开始只发了100个,他是现在就返回,还是等待继续发送,直到发完或出错再返回?
等待发完.

10、一个套接字关闭后经常会有一个TIME_WAIT状态,这种状态有什么用,假如想防止他的话,用什么办法,这种办法对最后的交换包有什么影响?
不知道...

11、closesocket和shutdown会堵塞吗?
所有数据与发送接收都是cancel的, 所以shutdown应该是不堵塞的. closesocket不太确信, 因为在closesocket时必须完成异步通知, 不知道是否需要阻塞.

12、客户端程序崩溃的时候一般会不会向服务器发包,假如会的话,发的是什么包?
不知道

13、客户机网线突然掉了,服务器能不能立即知道(服务器当时没有读的动作),假如不能的话,你用什么办法来得知?
不能, 我都是自己做KeepAlive的, 不知道是否有什么好的方法? (有好的方法一定要告我哦)

14、UDP服务器中,假如有session data的话,你在recvfrom的时候如何得到这个session data的指针?
???没明白

15、Keepalive和自己发送存活包哪种方法更有效?
Keepalive我试了n次, 好像都不太行, 不知道是不是搞错了. 自己发送存活包还是简单方便的.

16、listen的第二个参数究竟有什么作用?
调整该参数可以优化accept并发性能, 我以前在一台HP+Linux的破机器上测试, 当该值为20时, 性能最高.

17、select大概1000个读套接字的话,每次查找一个套接字是否处于可读大概需要多长时间?
晕倒了, 我从来没考虑过select本身的性能.

18、完成端口中你是怎么样实行完美关闭的?
???什么叫完美关闭???没听说过...
是不是指GetQueuedCompletionStatus线程的退出, 我一般是用PostQueuedCompletionStatus通知, 然后调用一个线程退出函数.

19、流量控制你是怎么做的?
???不知道

20、发往127.0.0.1的包经过网卡发送吗?
不需要.

21、TCP中的send成功能不能保证这些数据已经发出网卡,或者已发出网卡,但未收到对方的回复?
但然无关, send跟网卡无关吧.

22、发一个SYN包给监听服务器端口后,不再发包给他了,这种情况造成什么样的后果?
不知道.

23、发一个FIN包给一台机器的时候。
假如正好发到了他的监听端口上,会出现什么后果?
假如发到了未监听端口中,会收到什么样的包?
不知道.

24、RST包一般什么时候会收到?
不知道.

25、怎么做才能基本确保我的包不会被分片?为什么?
不知道. 我都是自己组包.

tgame 2003-12-26
  • 打赏
  • 举报
回复
0 = IPPROTO_IP
代码的简洁性 != 简单性
sevencat 2003-12-15
  • 打赏
  • 举报
回复
一些小技巧。

网络编程用多线程不可避免。必然要涉及到一个LOCK的问题。
有很多函数是这样写的。
void dosome()
{
cs.enter();
try
{}
catch(){cs.leave();}
..
}
这样做可能有时会忘掉leave了。可以写成这样
class CCriticalSectionOwner
{
public:
CCriticalSectionOwner(CCriticalSection &crit);
~CCriticalSectionOwner();
private :
CCriticalSection &m_crit;
};

CCriticalSectionOwner::CCriticalSectionOwner(CCriticalSection &crit)
: m_crit(crit)
{
m_crit.Enter();
}

CCriticalSectionOwner::~CCriticalSectionOwner()
{
m_crit.Leave();
}
然后只要有函数开始的时候声明一个实例就可以了。
bool setnoblock(SOCKET fd)
{
unsigned long param=1;
if(SOCKET_ERROR==ioctlsocket(fd,FIONBIO,¶m))
return false;
return true;
}

bool setlinger(SOCKET fd)
{
LINGER lingerStruct;

lingerStruct.l_onoff = 1;
lingerStruct.l_linger = 0;

if (SOCKET_ERROR == ::setsockopt(fd, SOL_SOCKET, SO_LINGER,
(char *)&lingerStruct, sizeof(lingerStruct)))
return false;
return true;
}

bool setkeepalive(SOCKET fd)
{
int param=1;
if(SOCKET_ERROR==::setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(char*)¶m,sizeof(param)))
return false;
return true;
}

bool checksocketerror()
{
int errnum=::WSAGetLastError();
switch(errnum)
{
case WSAEINTR:
return true;
case WSAEINPROGRESS:
return true;
case WSAEWOULDBLOCK:
return true;
case WSAEMSGSIZE:
return true;
case WSAENOBUFS:
return true;
default:
return false;
}
}

bool setrecvbuf(SOCKET fd,int bufsize)
{
int ret=setsockopt(fd,SOL_SOCKET,SO_RCVBUF,(char*)&bufsize,sizeof(bufsize));
if(SOCKET_ERROR==ret)
{
g_Log.log(__FUNCTION__,"Set recvbuf Error :%d",::WSAGetLastError());
return false;
}
return true;
}

bool setsendbuf(SOCKET fd,int bufsize)
{
int ret=setsockopt(fd,SOL_SOCKET,SO_SNDBUF,(char*)&bufsize,sizeof(bufsize));
if(SOCKET_ERROR==ret)
{
g_Log.log(__FUNCTION__,"Set sendbuf Error :%d",::WSAGetLastError());
return false;
}
return true;
}

另外还有一个网络对象同步的问题。
最常见的是即时消息。
当时在队列(或者哈希表)中查到了要发送的那个连接的指针,但是再发送的时候可能那个连接已经被DELETE掉了。这时候可以用一个引用计数来实现,查找的时候就addref,发送完了就release
applexgw 2003-12-14
  • 打赏
  • 举报
回复
mark
sevencat 2003-12-09
  • 打赏
  • 举报
回复
一个一个给分太麻烦。
要分的密我吧。
我倒分。
warton 2003-12-05
  • 打赏
  • 举报
回复
看来有公告的必要!
canjian 2003-12-05
  • 打赏
  • 举报
回复
收藏
seilfer2000 2003-12-05
  • 打赏
  • 举报
回复
很好的东西,收藏一下留着看
SyDes21 2003-12-05
  • 打赏
  • 举报
回复
有机会的话看一下了.
jacklondon 2003-11-28
  • 打赏
  • 举报
回复
我发现我躺了一脚浑水,各位脾气太大,我惹不起我只能退出。

题外话:
apache web server 和 mozila 项目开发人员都是极力反对 ANSI C++ 的,他们只用 C.

我发现 sevencat (七猫) 大侠与他们的风格很像,我对apache web server 和 mozila 项目开发人员并无恶意。我对sevencat (七猫)以及大家并无恶意。
zjp899 2003-11-26
  • 打赏
  • 举报
回复
标记,学习中
ZHENG017 2003-11-26
  • 打赏
  • 举报
回复
10.一个套接字关闭后经常会有一个TIME_WAIT状态:有什么用msdn中讲得很明白。
自己常用的一段代码:
static struct linger lig;
lig.l_onoff=1;
lig.l_linger=0;
static int iLen=sizeof(struct linger);

setsockopt(iSocketId,SOL_SOCKET,SO_LINGER,(char *)&lig,iLen);
#ifdef WIN32
iResult = closesocket(iSocketId);
#else
iResult = close(iSocketId);
#endif
加载更多回复(68)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧