對於同一個PC機而言,服務器端和客戶端在一個PC機上面,端口必須要不一樣,不然會沖突。
你總不能自己又當爹又當媽吧。
所以在進行程序設計的時候,需要考慮這一點:
在此接口設計中,C++當作UDP的服務器端
程序設計如下:
-
WSADATA wsaData = {0};
-
SOCKET socksvr;
-
int iPort=7900;
-
//服務器地址長度
-
int iLen = 0;
-
//接收數據的緩沖
-
int iSend = 0;
-
int iRecv = 0;
-
-
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
-
{
-
printf("Failed to load Winsock.\n");
-
return 0;
-
}
-
struct sockaddr_in ser;
-
ser.sin_family=AF_INET;
-
ser.sin_port=htons(8299);
-
ser.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
-
//建立服務端數據報套接口
-
socksvr=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
-
//udp綁定
-
bind(socksvr,(struct sockaddr*)&ser,sizeof(ser));
-
-
//客戶端信息地址,這里是點對點通信,需要加上IP+port。
-
//對於UDP來說,可以不用IP,因為它是無連接的。只要在一個網段就行。
-
//也就是說,無論是TCP還是UDP,都可以指定向某個電腦的端口發送數據。
-
//只需要在客戶端監聽此端口就行。對於TCP:connect,對於UDP:listen
-
struct sockaddr_in clientaddr = {0};
-
clientaddr.sin_family=AF_INET;
-
clientaddr.sin_port=htons(8300);//7901
-
clientaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
-
int nLen = sizeof(clientaddr);
-
-
Sleep(10);
-
-
string cam_dir = "C:\\CameraData";
-
mkdir(cam_dir.c_str());
-
while(1)
-
{
-
matrix.Num = 0;
-
matrix_vehicle.Num = 0;
-
if (0)//imgs_lane.isNew || imgs_pedestrain.isNew || imgs_vehicle.isNew
-
{
-
matrix = imgs_lane.Get();
-
pe = imgs_pedestrain.Get();
-
matrix_vehicle = imgs_vehicle.Get();
-
-
//行人有寬度信息,所以需要增加的不止一個點
-
-
matrix.point[matrix.Num++] = pe;//增加行人,若沒有,其標志位為0
-
-
if (matrix_vehicle.Num > 1) //增加車輛,若沒有,其標志位為0
-
{
-
for (int i = 0; i < matrix_vehicle.Num; ++i)
-
{
-
matrix.point[matrix.Num++] = matrix_vehicle.point[i];
-
}
-
}
-
-
if(matrix.Num > 0)
-
{
-
int ret = sendzmq->PubMsg("Camera_Data",matrix);
-
//int len = matrix.Num*sizeof(Point) + 4;
-
//sendudp->udpSendToCanet((unsigned char*)&matrix,len);
-
//cout << "ret num: " << ret << endl;
-
}
-
-
-
}
-
-
IplImage* demo = imgs_gray.Get();
-
-
-
//存儲圖片
-
//數據獨立存儲
-
char szFileName[_MAX_PATH] = {0};
-
SYSTEMTIME sys;
-
GetLocalTime(&sys);
-
long cntTime = sys.wHour*60*60*1000 + sys.wMinute*60*1000 +\
-
sys.wSecond*1000 + sys.wMilliseconds;
-
sprintf(szFileName, "%ld",cntTime);
-
-
string dir = cam_dir + "\\";
-
string tenp = "";
-
tenp = szFileName;
-
tenp += ".jpg";
-
dir += tenp;
-
//cvSaveImage 第三個參數可以設置壓縮的質量
-
int params[3];
-
params[0] = CV_IMWRITE_JPEG_QUALITY;
-
params[1] = 85;
-
params[2] = 0;
-
cvSaveImage(dir.c_str(),demo,params);
-
Sleep(1);
-
-
iSend=sendto(socksvr,dir.c_str(),dir.size(),0,(struct sockaddr*)&clientaddr,nLen);
-
-
cout << "ret: " << iSend << endl;
-
-
Sleep(100);
-
}
-
return 0;
-
}
用此保存后在讀取圖片的方式可以將300多K的數據壓縮至20K。大大減少數據量,基本上是20倍。
對於C#端,我們只需要接收固定端口的數據即可:
程序代碼設計如下:
-
private const int listenPort = 8300;
-
-
static void Main(string[] args)
-
{
-
UdpClient listener = new UdpClient(listenPort); //本機偵聽的端口號實例化
-
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); //實例化
-
-
while (true)
-
{
-
byte[] bytes = listener.Receive(ref groupEP);
-
-
string str = System.Text.Encoding.Default.GetString(bytes);
-
}
-
}
基本設計完畢。
實現的功能:從C++當中將圖片的存儲路徑發到C#端。