最近写的一个小程序,目的是实现两个应用程序A-B之间的通信,我选择使用了TCP Socket,采用阻塞方式进行。
程序的流程是:应用程序A向应用程序B发送数据(在其中指定程序B要执行的操作),然后应用程序B执行特定的操作,并返回操作的结果。
大部分情况下程序正常,程序正常,但是偶尔的情况下,应用程序A会收到“recv错误,错误类型10054”。程序的写法如下:
1. 定义了3个SOCKE变量:SocketA,SocketB,SocketC,它们的端口分别为10000,10001,10002。
2. 在应用程序A中,点击某个按钮,执行特定的操作,操作的流程是:
(1)connect-SocketA。
(2)send-向SocketA发送数据。
(3)recv-获取应用程序B操作的结果。
3. 应用程序B
在程序启动后,创建3个Socket(SocketA,SocketB,SocketC)。然后创建3个线程,分别用来监听这3个Socket。InitSocket
{
SocketA = socket(......);
bind-绑定SocketA。
SocketB = socket(......);
bind-绑定SocketB。 SocketC = socket(......);
bind-绑定SocketC。
}ThreadA
{
char sendBuf[4096];
char recvBuf[4096];
int rt = 0; listen-SocketA.
while( TRUE )
{
// 1.接收连接;
socket connSock = accept(.....); // 2.接收操作数;
recv(recvBuf,...); // 3.根据操作数执行不同的操作;
if( recvBuf[3]= 0x11 )
{
......
} if( recvBuf[3]= 0x22 )
{
......
} // 4.返回操作结果;
memcpy(sendBuf,&rt,sizeof(int));
send(......);
// 5. 关闭连接;
shutdown(connSock,SD_BOTH);
closesocket(connSock);
}关于socket的IO模型,我也看了一些,开始本打算用select,可是看到的一些例子都是使用循环遍历的方式查找Socket数组中的所有socket,然后轮流处理。在EventSelect的例子中,是建立一个监听Socket,然后收到连接后,创建一个新的Socket处理这个连接。对于完成端口,我的程序没有必要使用。请教问题出在哪里。现在这里谢谢了。
程序的流程是:应用程序A向应用程序B发送数据(在其中指定程序B要执行的操作),然后应用程序B执行特定的操作,并返回操作的结果。
大部分情况下程序正常,程序正常,但是偶尔的情况下,应用程序A会收到“recv错误,错误类型10054”。程序的写法如下:
1. 定义了3个SOCKE变量:SocketA,SocketB,SocketC,它们的端口分别为10000,10001,10002。
2. 在应用程序A中,点击某个按钮,执行特定的操作,操作的流程是:
(1)connect-SocketA。
(2)send-向SocketA发送数据。
(3)recv-获取应用程序B操作的结果。
3. 应用程序B
在程序启动后,创建3个Socket(SocketA,SocketB,SocketC)。然后创建3个线程,分别用来监听这3个Socket。InitSocket
{
SocketA = socket(......);
bind-绑定SocketA。
SocketB = socket(......);
bind-绑定SocketB。 SocketC = socket(......);
bind-绑定SocketC。
}ThreadA
{
char sendBuf[4096];
char recvBuf[4096];
int rt = 0; listen-SocketA.
while( TRUE )
{
// 1.接收连接;
socket connSock = accept(.....); // 2.接收操作数;
recv(recvBuf,...); // 3.根据操作数执行不同的操作;
if( recvBuf[3]= 0x11 )
{
......
} if( recvBuf[3]= 0x22 )
{
......
} // 4.返回操作结果;
memcpy(sendBuf,&rt,sizeof(int));
send(......);
// 5. 关闭连接;
shutdown(connSock,SD_BOTH);
closesocket(connSock);
}关于socket的IO模型,我也看了一些,开始本打算用select,可是看到的一些例子都是使用循环遍历的方式查找Socket数组中的所有socket,然后轮流处理。在EventSelect的例子中,是建立一个监听Socket,然后收到连接后,创建一个新的Socket处理这个连接。对于完成端口,我的程序没有必要使用。请教问题出在哪里。现在这里谢谢了。
在While循环中,我创建的是个临时变量socket connSock,用完后,就closesocket了。是不是我对closesocket的理解不对?
我的想法是这样的:
SocketA监听的是一个很频繁的操作,我这里需要“不停的获取某个数据”,因此在应用程序A中创建了一个线程,在其中使用While循环向SocketA发数据。
而SocketB和SocketC执行其他的操作,都是些不频繁的操作。
既然是循环发送,那么程序A中也是频繁的connect了?频繁的connect我不知道会发生什么,但显然不是什么好的做法。既然需要频繁操作的话,建议做长连接了,SocketA只需要accept一次,然后循环处理就行了。
既然是循环发送,那么程序A中也是频繁的connect了?频繁的connect我不知道会发生什么,但显然不是什么好的做法。既然需要频繁操作的话,建议做长连接了,SocketA只需要accept一次,然后循环处理就行了。
多谢。我使用WSAEventSelect改写程序。