1. 程式人生 > >C++和C# 雙向簡單的socket通訊 適用c#和c# c++和c++

C++和C# 雙向簡單的socket通訊 適用c#和c# c++和c++

程式1 建立兩個socket 一個繫結套接字  一個不繫結  然後用繫結的socket來專門接收8000埠的訊息 用不繫結的socket來發送8001埠的訊息

程式2 建立兩個socket 一個繫結套接字  一個不繫結  然後用繫結的socket來專門接收8001埠的訊息 用不繫結的socket來發送8000埠的訊息

程式1程式碼如下 C#

        public static Socket server;

        public static void InitServer(JLBaseballPositionSystemTest testcase)
        {

            server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            server.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8000));//繫結埠號和IP
            Console.WriteLine("服務端已經開啟");
            Thread t = new Thread(ReciveMsg);//開啟接收訊息執行緒
            t.Start();
            Thread t2 = new Thread(sendMsg);//開啟發送訊息執行緒
            t2.Start();


        }
        /// <summary>
        /// 向特定ip的主機的埠傳送資料報
        /// </summary>
        static void sendMsg()
        {
            Socket servertoclick = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            EndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
            while (true)
            {
                string msg ="hellow click"; Console.ReadLine();
                servertoclick.SendTo(Encoding.UTF8.GetBytes(msg), point);
            }


        }
        /// <summary>
        /// 接收發送給本機ip對應埠號的資料報
        /// </summary>
        static void ReciveMsg()
        {
            while (true)
            {
                EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用來儲存傳送方的ip和埠號
                byte[] buffer = new byte[1024];
                int length = server.ReceiveFrom(buffer, ref point);//接收資料報
                string message = Encoding.UTF8.GetString(buffer, 0, length);
                Console.WriteLine(point.ToString() + message);

            }
        }

程式2 C++

#include <cstdlib>
#include <iostream>
#include "stdafx.h"
#include <windows.h>
#include <stdlib.h>
#include <winsock.h>
#include <time.h>
#include "dbghelp.h"
#include <process.h>

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

unsigned __stdcall UpdateTicketsLoop(LPVOID arguments);

bool sendToServer()
{
	WORD socketVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(socketVersion, &wsaData) != 0)
	{
		return 0;
	}
    //啟動傳送訊息執行緒
	HANDLE threadHandle;
	unsigned threadId = 0;
	threadHandle = (HANDLE)_beginthreadex(NULL, 0, UpdateTicketsLoop, NULL, 0, &threadId);
    //建立接收訊息socket
	SOCKET sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(8000);
	sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	int len = sizeof(sin);
	// 繫結套接字  
	int nRet = bind(sclient, (SOCKADDR*)&sin, sizeof(SOCKADDR));
	while (true)
	{
		char recvData[255];
		int ret = recvfrom(sclient, recvData, 255, 0, (sockaddr *)&sin, &len);
		if (ret > 0)
		{
			recvData[ret] = 0x00;
			printf(recvData);
		}

	}


	closesocket(sclient);
	WSACleanup();
	return true;
}


int main()
{
	sendToServer();
	
	return 0;
}
//啟動傳送執行緒
unsigned __stdcall UpdateTicketsLoop(LPVOID arguments)
{
        SOCKET clienttoserver = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
		sockaddr_in sin;
		sin.sin_family = AF_INET;
		sin.sin_port = htons(10831);
		sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
		int len = sizeof(sin);
		const char * sendData = "hellow server";
	while (true)
	{
		Sleep(1000);
		
		sendto(clienttoserver, sendData, strlen(sendData), 0, (sockaddr *)&sin, len);
	}
    closesocket(clienttoserver);
	return 0;
}