在我的程序的服务器端,当程序点击接受函数时,它会等待连接。找到连接传入后(在我与客户端连接后),accept() 方法返回 1。基于该返回,它尝试接收并发送到错误套接字的套接字 1。
这是我服务器上的一些代码:
for(;;)
{
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR)
找到连接后,sConnect 的值为 1。
为什么会这样?我该如何解决?
在我的程序的服务器端,当程序点击接受函数时,它会等待连接。找到连接传入后(在我与客户端连接后),accept() 方法返回 1。基于该返回,它尝试接收并发送到错误套接字的套接字 1。
这是我服务器上的一些代码:
for(;;)
{
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR)
找到连接后,sConnect 的值为 1。
为什么会这样?我该如何解决?
在 Windows 上,如果accept()
失败,则返回INVALID_SOCKET
,而不是SOCKET_ERROR
。
真正的问题是您的if()
语句同时执行赋值和比较,但它缺少一组必需的赋值括号,因此它实际上是在比较一个与您预期不同的值。改为这样做:
if( (sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen)) != INVALID_SOCKET )
更好的选择是将分配和比较分开:
sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != INVALID_SOCKET )
因为您将按值返回的accept
值与SOCKET_ERROR
将此布尔值进行比较并将其分配给sConnect
:
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen) != SOCKET_ERROR)
就个人而言,我不喜欢这么长的线路。分离赋值和比较:
sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != SOCKET_ERROR )
...
或至少添加括号。
尝试这个:
sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen);
if( sConnect != INVALID_SOCKET)