C++和C# 雙向簡單的socket通訊 適用c#和c# c++和c++
阿新 • • 發佈:2019-02-14
程式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; }