C#應用程序有一個後臺工作線程,它啓動一個buttonclick。c#監聽器和winsock發送者DLL之間的套接字通信
private void button1_Click(object sender, EventArgs e)
{
if (bw.IsBusy != true)
{
bw.RunWorkerAsync();
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener serverSocket = new TcpListener(localAddr,7898);
int requestCount = 0;
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
clientSocket = serverSocket.AcceptTcpClient();
requestCount = 0;
while ((true))
{
try
{
requestCount = requestCount + 1;
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
//Console.WriteLine(" >> Data from client - " + dataFromClient);
string serverResponse = "Server response " + Convert.ToString(requestCount);
Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
//Console.WriteLine(" >> " + serverResponse);
}
catch (Exception ex)
{
//Console.WriteLine(ex.ToString());
}
}
clientSocket.Close();
serverSocket.Stop();
Console.WriteLine(" >> exit");
Console.ReadLine();
我也有在C++ DLL,C#語言參考,下面的代碼
WSADATA WsaDat;
if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0){
cout<<"WSA FAILED\n";
cin.get();
return 0;
}
SOCKET Socket;
Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (Socket == SOCKET_ERROR){
cout<<"Socket Failed to load\n";
cin.get();
return 0;
}
SOCKADDR_IN server;
server.sin_port=htons (7898);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
if (bind(Socket, (SOCKADDR *)(&server), sizeof (server)) == SOCKET_ERROR)
{
cout<<"BINDING FAILED\n";
cin.get();
return 0;
}
char buffer[256]; // Declaring a buffer on the stack
ZeroMemory(buffer, 256);
sprintf(buffer,"--------------------- Processing Side (%s) ---------------------- --- \n", (side ? "A" : "B"));
int nret = send(Socket,
buffer,
strlen(buffer), // Note that this specifies the length of the string; not
// the size of the entire buffer
0); // Most often is zero, but see MSDN for other options
如果我踏入的代碼,我發現,調試黃色箭頭消失在這條線
clientSocket = serverSocket.AcceptTcpClient();
C#GUI出現,雖然按鈕仍然可以按下,但它不會再次進入代碼。我從互聯網上搜索了這些代碼片段,因此可能存在我不熟悉的錯誤。任何人都可以看到我的努力出了什麼問題嗎?爲什麼調試在上面的行消失了,並且C#gui出現了?
的感謝!
感謝您的答案。我做了以下,但連接調用失敗。這是因爲端口號?在C#中它是7898.在C++中它是htons(7898),這是另一個數字。
SOCKADDR_IN server;
server.sin_port=htons (7898);
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
if (bind(Socket, (SOCKADDR *)(&server), sizeof (server)) == SOCKET_ERROR)
{
cout<<"BINDING FAILED\n";
cin.get();
return 0;
}
//----------------------
// Connect to server.
int iResult = connect(Socket, (SOCKADDR *) & server, sizeof (server));
if (iResult == SOCKET_ERROR) {
wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
iResult = closesocket(Socket);
if (iResult == SOCKET_ERROR)
wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
在C#
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener serverSocket = new TcpListener(localAddr,7898);
我讀了htons文檔,並認爲該端口號是好的,而不是問題。那麼它不連接? 再次感謝!
謝謝尼古拉!我相信我的客戶端是發送信息的C++ dll。我對嗎?如果是,我該如何修改代碼才能連接到正在監聽的c#服務器? – user2192008