当前位置:编程学习 > C#/ASP.NET >>

用C#写服务器,C写客户端的SOCKET通信

// 我的客户端.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <windows.h>


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


#define DEFAULT_COUNT       1
#define DEFAULT_PORT        5150
#define DEFAULT_BUFFER      256
#define SLEEP_TIME 5*1000

int   iPort     = DEFAULT_PORT; 
DWORD dwCount   = DEFAULT_COUNT;
BOOL  bRevOnly = FALSE;         


using namespace std;

int client_operate(char szServer[128],BYTE szMessage[],int n)
{
WSADATA       wsd;
    SOCKET        sClient;
    char          szBuffer[DEFAULT_BUFFER];
    int           ret;

memset(szBuffer,0,DEFAULT_BUFFER);
    struct sockaddr_in server;
    struct hostent    *host = NULL;
    if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
    {
        printf("Failed to load Winsock library!\n");
        return 1;
    }

    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient == INVALID_SOCKET)
    {
        printf("socket() failed: %d\n", WSAGetLastError());
        return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(iPort);
    server.sin_addr.s_addr = inet_addr(szServer);

    if (server.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServer);
        if (host == NULL)
        {
            printf("Unable to resolve server: %s\n", szServer);
            return 1;
        }
        CopyMemory(&server.sin_addr, host->h_addr_list[0],
            host->h_length);
    }
    if (connect(sClient, (struct sockaddr *)&server, 
        sizeof(server)) == SOCKET_ERROR)
    {
        printf("connect() failed: %d\n", WSAGetLastError());
        return 1;
    }
    // Send and receive data 
    //


if (!bRevOnly)
{
ret = send(sClient, (char *)szMessage, n, 0);
    if (ret == 0)
return 0;
else if (ret == SOCKET_ERROR)
{
printf("send() failed: %d\n", WSAGetLastError());
return 0;
}
printf("Send %d bytes\n", ret);
}
      if (ret == 0)       
           return 0;
      else if (ret == SOCKET_ERROR)
      {
         printf("recv() failed: %d\n", WSAGetLastError());
          return -1;
  }

//   printf("RECV [%d bytes]: '%s'\n", ret, szBuffer);

    closesocket(sClient);
    WSACleanup();
    return 0;

}



int _tmain(int argc, char* argv[])
{
BYTE ss[3] = {0x31,0x32,0x33};
client_operate("127.0.0.1",ss,3);
}



    private void Sever()
        {

            Socket serverSocket;

            Thread thread;

            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5150); 

            serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

            serverSocket.Bind(ipep); 

            serverSocket.Listen(10); 

            while (true) 

            { 

                Socket  clientSocket = serverSocket.Accept();

                thread = new Thread(doWork);

                thread.Start(clientSocket); 



            } 

        }

        private void doWork(object clientSocket) 

        { 

            Socket s = (Socket)clientSocket;//客户端信息 

            IPEndPoint ipEndPoint = (IPEndPoint)s.RemoteEndPoint; 

            String address = ipEndPoint.Address.ToString(); 

            String port = ipEndPoint.Port.ToString(); 

            Console.WriteLine(address + ":" + port + " 连接过来了"); 

            Byte[] inBuffer = new Byte[1024]; 

            String inBufferStr; 

            try 

            {
                while (true)
                {

                    s.Receive(inBuffer, 1024, SocketFlags.None);                    

                    inBufferStr = Encoding.ASCII.GetString(inBuffer);   //实际处理二进制不用这行

                   // Console.WriteLine(address + ":" + port + "说:");

                    //这里开线程进行处理即可

                   MessageBox.Show(inBufferStr);

                  //  Console.WriteLine(inBufferStr);    //实际也不用这行
                    
                }


            } 

            catch 

            { 

                MessageBox.Show("客户端已关闭!","提示"); 

            }
            s.Close();

        } 


功能是很简单,但是当 s.Receive(inBuffer, 1024, SocketFlags.None);执行到这一步的时候不会阻塞,  我用C# 写过客户端 是可以阻塞的,但是C发C#就不行,,求高手~~!
--------------------编程问答-------------------- 试验了一下C# 发 C没有问题,
c 发 C没问题,
c 发 C#有问题,
C# 发 C#没问题
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,