tcp communication btw c# and C++

6 篇文章 0 订阅

用C++建立客户端Socket,怎么用C#建立服务器端Socket进行通信,C++发数据,C#收数据。请给出示例代码。

2011-4-12 09:43
提问者: lisiliang06  |  浏览次数:582次
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "Ws2_32.lib")

#define DEFAULT_BUFLEN 4096
#define DEFAULT_PORT 8000


int main(int argc, char* argv[])
{
 
 if(argc == 1)
 {
  printf("Please Input the Address of Input File!\n");
  return 0;
 } 

 //Buffers
 int recvbuflen = DEFAULT_BUFLEN;
    char sendbuf[DEFAULT_BUFLEN];
    char recvbuf[DEFAULT_BUFLEN] = "";

 //FILE 
 FILE* file = fopen("C:/1.txt", "rb");

 if(file == NULL)
 {
  printf("Failed to open Input File!\n");
  return 0 ;
 }


 while(1)
 {
  //SOCKET
  //----------------------
  // Declare and initialize variables.
  int iResult;
  WSADATA wsaData;

  // Initialize Winsock
  iResult = WSAStartup(MAKEWORD(1,1), &wsaData);
  if (iResult != NO_ERROR)
  {
   printf("WSAStartup failed with error: %d\n", iResult);
   return 1;
  }

  SOCKET ConnectSocket;
  struct sockaddr_in clientService; 

  // Create a SOCKET for connecting to server
  ConnectSocket = socket(AF_INET, SOCK_STREAM, 0)  ;

  if (ConnectSocket == INVALID_SOCKET)
  {
   printf("socket failed with error: %ld\n", WSAGetLastError());
   WSACleanup();
   continue;
  }

  //----------------------
  // The sockaddr_in structure specifies the address family,
  // IP address, and port of the server to be connected to.
  clientService.sin_family = AF_INET;
  clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" );
  clientService.sin_port = htons( DEFAULT_PORT );

  //----------------------
  // Connect to server.
  iResult = connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) ; 
    
  if (iResult == SOCKET_ERROR) 
  {
   printf( "connect failed with error: %d\n", WSAGetLastError() );
   closesocket(ConnectSocket);
   WSACleanup();
   continue;
  }
  
  while(1)
  {
   fread(sendbuf, DEFAULT_BUFLEN,  sizeof(char), file);

   if(feof(file))
   {
    printf("Reading to the end of input file, seek to the beginning of File!\n");
    fseek(file, 0, SEEK_SET);
   }
   
   //----------------------
   // Send an initial buffer
   iResult = send( ConnectSocket, sendbuf, DEFAULT_BUFLEN, 0 );
   
   if (iResult == SOCKET_ERROR) 
   {
    printf("send() failed with error: %d\n", WSAGetLastError());
    closesocket(ConnectSocket);
    WSACleanup();
    break;
   }
   else
   {
    printf("Send package size = %d \n", iResult);
   }
  }

  if (iResult == SOCKET_ERROR) 
  {
   continue;
  }

  // shutdown the connection since no more data will be sent
  iResult = shutdown(ConnectSocket, SD_SEND);

  if (iResult == SOCKET_ERROR) 
  {
   printf("shutdown failed with error: %d\n", WSAGetLastError());
   closesocket(ConnectSocket);
   WSACleanup();
   return 1;
  }

  // cleanup
  closesocket(ConnectSocket);
  WSACleanup();
 }
 
 return 0 ;
    
}
我来帮他解答
2011-4-12 09:51
满意回答
TcpListener进行监听就可以了。
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;

class MyTcpListener
{
  public static void Main()
  { 
    TcpListener server=null;   
    try
    {
      // Set the TcpListener on port 13000.
      Int32 port = 8000;
      IPAddress localAddr = IPAddress.Parse("127.0.0.1");
      
      // TcpListener server = new TcpListener(port);
      server = new TcpListener(localAddr, port);

      // Start listening for client requests.
      server.Start();
         
      // Buffer for reading data
      Byte[] bytes = new Byte[4096];
      String data = null;

      // Enter the listening loop.
      while(true) 
      {
        Console.Write("Waiting for a connection... ");
        
        // Perform a blocking call to accept requests.
        // You could also user server.AcceptSocket() here.
        TcpClient client = server.AcceptTcpClient();            
        Console.WriteLine("Connected!");

        data = null;

        // Get a stream object for reading and writing
        NetworkStream stream = client.GetStream();

        int i;

        // Loop to receive all the data sent by the client.
        while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
        {   
          // Translate data bytes to a ASCII string.
          data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
          Console.WriteLine("Received: {0}", data);
       
          // Process the data sent by the client.
          data = data.ToUpper();

          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);

          // Send back a response.
          stream.Write(msg, 0, msg.Length);
          Console.WriteLine("Sent: {0}", data);            
        }
         
        // Shutdown and end connection
        client.Close();
      }
    }
    catch(SocketException e)
    {
      Console.WriteLine("SocketException: {0}", e);
    }
    finally
    {
       // Stop listening for new clients.
       server.Stop();
    }

      
    Console.WriteLine("\nHit enter to continue...");
    Console.Read();
  }   
}

当然,官方的这个示例是单线程的,一次只能处理一个客户端,你可以将accept到的client扔到一个独立的线程,这样就可以多客户端并发处理了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值