NI LabVIEW,CVI,数据采集等产品讨论区

取消
显示结果 
搜索替代 
您的意思是: 

TestStand下实现Socket有问题

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函数收不到东西,阻塞在那。不知何故,盼复

0 项奖励
1 条消息(共 2 条)
4,239 次查看
大家讨论一下如何,没人了解吗?
0 项奖励
2 条消息(共 2 条)
4,199 次查看