下面的代码是一个TCP server端的代码一部分,采用Socket通讯,从msdn上 拷贝的.
if( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n"); SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
看到这里的时候我看不懂了,listen函数建立监听后,AcceptSocket = SOCKET_ERROR这句是什么意思? 让一个socket类型= SOCKET_ERROR是什么意思啊?? 这个SOCKET_ERROR又是什么呢? 它是什么情况下触发的呢??它应该是Socket 错误代码吧, 怎么会是一个socket 类型呢??而代码的意思似乎是说如果有客户端的connect,那么AcceptSocket == SOCKET_ERROR ,好象说只要有客户端connect,那么就会触发SOCKET_ERROR ,然后执行AcceptSocket = accept( m_socket, NULL, NULL )这句.?? 各位 这句代码到底怎么理解啊 ?? 谢谢指点啊!!
if( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n"); SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
看到这里的时候我看不懂了,listen函数建立监听后,AcceptSocket = SOCKET_ERROR这句是什么意思? 让一个socket类型= SOCKET_ERROR是什么意思啊?? 这个SOCKET_ERROR又是什么呢? 它是什么情况下触发的呢??它应该是Socket 错误代码吧, 怎么会是一个socket 类型呢??而代码的意思似乎是说如果有客户端的connect,那么AcceptSocket == SOCKET_ERROR ,好象说只要有客户端connect,那么就会触发SOCKET_ERROR ,然后执行AcceptSocket = accept( m_socket, NULL, NULL )这句.?? 各位 这句代码到底怎么理解啊 ?? 谢谢指点啊!!
if( listen( m_socket, 1 ) == SOCKET_ERROR )意识是如果监听失败,执行printf( "Error listening on socket.\n");
据msdn上述:SOCKET accept (SOCKET s,struct sockaddr FAR* addr, int FAR* addrlen );
所以accept返回SOCKET 类型;
据msdn上述:
If no error occurs, accept returns a value of type SOCKET that is a descriptor for the new socket. This returned value is a handle for the socket on which the actual connection will be made.Otherwise, a value of INVALID_SOCKET is returned, and a specific error code can be retrieved by calling
如果accept没错误,则返回一个SOCKET,如果错误返回INVALID_SOCKET
定义一个 SOCKET AcceptSocket;
AcceptSocket = accept( m_socket, NULL, NULL )
我想看他成功没比较一下if(AcceptSocket ==INVALID_SOCKET)
{ AfxMessageBox("连接失败");
}
else
{AfxMessageBox("连接成功");
}
AcceptSocket = accept( m_socket, NULL, NULL );
}
那么这个while执行的时候 AcceptSocket == SOCKET_ERROR 什么时候会满足呢??也就是说 这个SOCKET_ERROR 是 什么时候 从哪里 得来的啊?? 谢谢各位再指点指点!
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
这个是不是这样理解啊?? 刚开始AcceptSocket = SOCKET_ERROR;所以
while ( AcceptSocket == SOCKET_ERROR ) 这个相当于while(1), 所以执行AcceptSocket = accept( m_socket, NULL, NULL ); 这时如果没有 客户端connect 那么 AcceptSocket == SOCKET_ERROR 还是满足那么 继续循环,直到 有客户端连接,那么AcceptSocket返回了一个有效的socket后,while ( AcceptSocket == SOCKET_ERROR )的这个条件就不满足 所以 跳出整个while循环 继续执行 printf( "Client Connected.\n");这些下面的语句。如果是这样理那么我有一个问题就是说 accept的错误返回INVALID_SOCKET 和 SOCKET_ERROR 是一样的东西吗??也就是说如果 accept 错误那么 系统会 自动发送一个SOCKET_ERROR 而这个SOCKET_ERROR 就是INVALID_SOCKET ???
SOCKET_ERROR实际上是个宏他被定义为 -1
while ( AcceptSocket == SOCKET_ERROR )
{
AcceptSocket = accept( m_socket, NULL, NULL );
}
也就是如果AcceptSocket==-1的时候开始连接
你可以选定要看的如SOCKET_ERROR 然后点右建,按go to Definition 相看
最好把全部的原代码贴出来!!!一段看不明白
{ AcceptSocket = SOCKET_ERROR; //AcceptSocket=-1
while ( AcceptSocket == SOCKET_ERROR ) //AcceptSocket=-1
{
AcceptSocket = accept( m_socket, NULL, NULL );//连上返回连接的SOCKET,没连 //上返回INVALID_SOCKET, AcceptSocket!=SOCKET_ERROR 了;退出while ( AcceptSocket)
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
while ( AcceptSocket == SOCKET_ERROR )继续循环一直等到有连接才跳出这个 while!我代码明天贴给你, 现在 不在我这台机子上! 非常感谢你 bt66666666这么晚了 还热心的帮忙!
AcceptSocket = accept( m_socket, NULL, NULL );//连上返回连接的SOCKET,没连 //上返回INVALID_SOCKET, AcceptSocket!=SOCKET_ERROR 了;退出while ( AcceptSocket)
}
完了,本来就应该继续执行下一条语句,下一条就是printf( "Client Connected.\n");
完了在m_socket = AcceptSocket;在退出循环
#include "stdafx.h"#include <stdio.h>
#include "winsock2.h"
int main(int argc, char* argv[])
{
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n"); // Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 0;
}
// Bind the socket.
sockaddr_in service; service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "10.167.11.89" );
service.sin_port = htons( 6002 ); if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return 0;
}
// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n"); // Accept connections.
SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
// break;
}
// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";
bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Bytes Recv: %ld\n", bytesRecv );
bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent ); return NULL; //return 0;
}
AcceptSocket = accept( m_socket, NULL, NULL );
} 这个循环体会一直循环, 进入死循环. 也就是说accept 的返回值INVALID_SOCKET永远=SOCKET_ERROR 使得循环体一直循环下去. 但是我去看了下 头文件,发现
#define INVALID_SOCKET (SOCKET)(~0)
#define SOCKET_ERROR (-1) ,从个宏定义看,如果accept返回INVALID_SOCKET 应该不等于SOCKET_ERROR (-1) 才对啊?? 为什么 程序是一直循环的呢???
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
// break;//这是个死循环啊,循环退不出!!!
}
#include <stdio.h>
#include "winsock2.h"
int main(int argc, char* argv[])
{
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");// Create a socket.
SOCKET m_socket;
m_socket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );if ( m_socket == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
WSACleanup();
return 0;
}
// Bind the socket.
sockaddr_in service;service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "202.114.61.73" );
service.sin_port = htons(6002);if ( bind( m_socket, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR ) {
printf( "bind() failed.\n" );
closesocket(m_socket);
return 0;
}// Listen on the socket.
if ( listen( m_socket, 1 ) == SOCKET_ERROR )
printf( "Error listening on socket.\n");// Accept connections.
SOCKET AcceptSocket;printf( "Waiting for a client to connect...\n" );
while (1)
{
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR )
{
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}// Send and receive data.
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";bytesRecv = recv( m_socket, recvbuf, 32, 0 );
printf( "Bytes Recv: %ld\n", bytesRecv );bytesSent = send( m_socket, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );return NULL;//return 0;
}
#include <stdio.h>
#include <winsock.h>int main()
{
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD( 2, 2 );
WSAStartup( wVersionRequested, &wsaData );
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( );
}
SOCKET socketclient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr=inet_addr("202.114.61.73");
addr.sin_family=AF_INET;
addr.sin_port=htons(6002);
connect(socketclient,(SOCKADDR*)&addr,sizeof(SOCKADDR));
char buf[100];
char bufsend[100]="SB我晓得了";
send(socketclient,bufsend,strlen(bufsend),0);
recv(socketclient,buf,100,0);
printf("%s",buf);
}