怎么删除sendto之后的内容
- C/C++ code
DWORD WINAPI CChatDlg::FunRecv(LPVOID lpParameter) //开的一个线程接受函数{ RecvData * p = (RecvData *)(lpParameter); HWND hwnd = p ->hwnd; SOCKET socket = p ->socket; delete lpParameter; sockaddr_in addConn; int Len = sizeof(addConn); char recvBuf[200] = {0}; char temp[300] = {0}; while(TRUE) { int n = recvfrom(socket,recvBuf,200,0,(sockaddr*)&addConn,&Len); sprintf_s(temp,"%s say : %s",inet_ntoa(addConn.sin_addr),recvBuf); ::PostMessage(hwnd,WM_SENDTO,0,(LPARAM)(temp)); } return 0;}void CChatDlg::OnBnClickedButton1() //发送函数{ DWORD dwIP; ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); sockaddr_in addSer; addSer.sin_addr.S_un.S_addr = htonl(dwIP); addSer.sin_family = AF_INET; addSer.sin_port = htons(6000); int Len = sizeof(addSer); CString strSend; GetDlgItemText(IDC_EDIT1,strSend); int n = strSend.GetLength(); char *sendBuf = new char[2*(n+1)]; USES_CONVERSION; sendBuf = T2A(strSend.GetBuffer(strSend.GetLength())); int nSize = sendto(m_socket,sendBuf,2*(n+1) + 1,0,(sockaddr*)&addSer,Len); delete [] strSend; //此句报错}//sendto只能用char类型,只能将strSend复制到char数组中,大小都乘2(若是汉字占两个字节,字母就浪费一些)。//我想sendto是同步函数,发送完之后就delete掉,因为前面recvfrom接受函数不是动态内存,应该会拷贝一份内容。[解决办法]
sendto只能用char类型,只能将strSend复制到char数组中
---------------------
这个理解的不对,可以是任意数据结构,发送和接收两边对等就行了。(如果发送结构体的话,里面最好不要含有指针成员变量)
[解决办法]
虽然说sendto的参数是 char *
但是强制转换之后仍旧可以发送其他类型的数据。。。
[解决办法]
delete [] strSend; //此句报错
改为
delete [] sendBuf
[解决办法]
1、delete [] strSend; //此句报错
你删除CString当然会报错,应该象楼上所说
delete [] sendBuf;
2、另外你说的sendto只能发送char的理解应该这样说,sendto是把发送的数据当作char字节流,而具体数据是什么意思由发送与接收双方相互解释就可以,例如你需要发送一个结构(注意结构使用固定长度的成员,最好不要使用结构,如果使用变长的数据成员就需要加上长度标识),只需要把结构的指针强制转换成char指针就可以
3、sendto是同步函数这个理解也是有点问题的,sendto是UDP协议使用的,一般会立即返回,不会阻塞发送线程的,也不能保证对方接收到,如果需要知道对方是否接收还需要对方返回一个接收成功的消息,一般是sendto后一定时间内没有接收到返回消息就认为发送失败需要再次重新发送