#cgo windows,amd64 LDFLAGS: -lWS2_32
引用的C头部添加上面这个 写个例子
package main
/*
#cgo windows,amd64 LDFLAGS: -lWS2_32
#include <windows.h>
#include <stdio.h>
#include "define.h"
#include <windows.h>
#define host "127.0.0.1"
#define port 5556
#pragma comment(lib, "ws2_32.lib")
void socket_def(SOCKET *sock, char *host_t, int port_t)
{
WSADATA wsaData;
struct sockaddr_in saddr;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("error");
}
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port_t);
saddr.sin_addr.s_addr = inet_addr(host_t);
*sock = socket(AF_INET, SOCK_DGRAM, 0);
if (*sock == INVALID_SOCKET)
{
printf("socket initialize failed: %d/n", WSAGetLastError());
}
}
int get_process_info()
{
HANDLE hDevice;
int status;
HANDLE m_hCommEvent;
ULONG dwReturn;
char outbuf[255];
CHECKLIST CheckList;
SOCKET sock;
WSADATA wsaData;
struct sockaddr_in saddr;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("error");
}
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port_t);
saddr.sin_addr.s_addr = inet_addr(host_t);
sock = socket(AF_INET, SOCK_DGRAM, 0);
hDevice = NULL;
m_hCommEvent = NULL;
hDevice = CreateFile("\\\\.\\MyEvent",
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hDevice == INVALID_HANDLE_VALUE)
{
printf("createfile wrong\n");
getchar();
return 0;
}
m_hCommEvent = CreateEvent(NULL,
0,
0,
NULL);
printf("hEvent:%08x\n", m_hCommEvent);
status = DeviceIoControl(hDevice,
IOCTL_PASSEVENT,
&m_hCommEvent,
sizeof(m_hCommEvent),
NULL,
0,
&dwReturn,
NULL);
if (!status)
{
printf("IO wrong+%d\n", GetLastError());
getchar();
return 0;
}
CheckList.ONLYSHOWREMOTETHREAD = TRUE;
CheckList.SHOWTHREAD = TRUE;
CheckList.SHOWTERMINATETHREAD = FALSE;
CheckList.SHOWTERMINATEPROCESS = FALSE;
status = DeviceIoControl(hDevice,
IOCTL_PASSEVSTRUCT,
&CheckList,
sizeof(CheckList),
NULL,
0,
&dwReturn,
NULL);
if (!status)
{
printf("IO wrong+%d\n", GetLastError());
getchar();
return 0;
}
printf(" [Process Name] [PID] [TID] [Parent Process Name] [PID] [TID]\n");
while (1)
{
ResetEvent(m_hCommEvent);
WaitForSingleObject(m_hCommEvent, INFINITE);
status = DeviceIoControl(hDevice,
IOCTL_PASSBUF,
NULL,
0,
&outbuf,
sizeof(outbuf),
&dwReturn,
NULL);
if (!status)
{
printf("IO wrong+%d\n", GetLastError());
getchar();
return 0;
}
printf("%s", outbuf);
sendto(sock,outbuf,strlen(outbuf),0,(struct sockaddr *)&saddr,sizeof(saddr));
}
status = DeviceIoControl(hDevice,
IOCTL_UNPASSEVENT,
NULL,
0,
NULL,
0,
&dwReturn,
NULL);
if (!status)
{
printf("UNPASSEVENT wrong+%d\n", GetLastError());
getchar();
return 0;
}
status = CloseHandle(hDevice);
status = CloseHandle(m_hCommEvent);
getchar();
return 0;
}
*/
import "C"
import (
"net"
"fmt"
)
func main() {
C.get_process_info()
var localaddress,_=net.ResolveUDPAddr("udp",":5556")
var udplistener,err=net.ListenUDP("udp",localaddress)
if err!=nil{
fmt.Print("error")
return
}
defer func(){
udplistener.Close()
}()
var buf[255]byte
n,_,err:=udplistener.ReadFromUDP(buf[0:])
if err!=nil{
fmt.Print("dd")
return
}
fmt.Print(string(buf[0:n]))
}
监听到进程启动通过socket发送给指定的端口。