TestStand下实现Socket有问题
代码如下:
服务器端:
// ShellAPI.cpp: implementation of the ShellAPI class.
//
//////////////////////////////////////////////////////////////////////
#include "ShellAPI.h"
#import "teapi.dll"
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
extern "C"
{
void __declspec(dllexport) __stdcall SelfTest(TS::SequenceContext *seqContext, bool &result)
{
WSADATA wsaData;
int iResult ;
SOCKET server;
sockaddr_in service;
SOCKET AcceptSocket;
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Server: Sending Data.";
char recvbuf[32] = "";
char i;
iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
result = false;
// new socket
server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( server == INVALID_SOCKET )
{
result = false;
}
BOOL bReuseaddr=TRUE;
setsockopt(server,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
// bind socket
service.sin_family = AF_INET;
//service.sin_addr.s_addr = inet_addr( "172.20.0.30" );
service.sin_addr.s_addr = inet_addr( "192.168.0.1" );
service.sin_port = htons( 27015 );
if ( bind( server, (SOCKADDR*) &service, sizeof(service) ) == SOCKET_ERROR )
{
result = false;
}
// listen socket
if ( listen( server, 1 ) == SOCKET_ERROR )
result = false;
// accept link
while (1)
{
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR )
{
AcceptSocket = accept( server, NULL, NULL );
}
server = AcceptSocket;
break;
}
for(i =1; i <= 100; i++)
{
// send
bytesSent = send( server, sendbuf, strlen(sendbuf), 0 );
//receive
bytesRecv = recv( server, recvbuf, 32, 0 );
}
closesocket(server);
WSACleanup();
result = true;
}
}
客户端:
#include "stdafx.h"
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")
int main(int argc, char* argv[])
{
WSADATA wsaData;
SOCKET client;
sockaddr_in clientService;
int bytesSent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Client: Sending data.";
char recvbuf[32] = "";
bool bReuseaddr = true;
int iResult;
int i;
iResult = WSAStartup( MAKEWORD(2,2), &wsaData );
if ( iResult != NO_ERROR )
printf("Error at WSAStartup()\n");
// 建立socket socket.
client = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if ( client == INVALID_SOCKET ) {
printf( "Error at socket(): %ld\n", WSAGetLastError() );
return 0;
}
setsockopt(client, SOL_SOCKET, SO_REUSEADDR, (const char*)&bReuseaddr, sizeof(bool));
// 连接到服务器.
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "192.168.0.2" );
clientService.sin_port = htons( 27015 );
if ( connect( client, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
return 0;
}
for(i = 0; i < 1; i++)
{
// 发送并接收数据.
while( bytesRecv == SOCKET_ERROR ) {
bytesRecv = recv( client, recvbuf, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
if (bytesRecv < 0)
return 0;
printf( "Bytes Recv: %ld\n", bytesRecv );
bytesSent = send( client, sendbuf, strlen(sendbuf), 0 );
printf( "Bytes Sent: %ld\n", bytesSent );
}
}
closesocket(client);
Sleep(50);
WSACleanup();
Sleep(50);
return 0;
}
以上代码在VC6环境下编译通信均正常,但把服务器端编译成dll整合到teststand序列中只能执行两次,第三次客户端connect函数能成功,
但服务器端accept函数收不到东西,阻塞在那。不知何故,盼复