无论点击发送,还是接收都死掉了,为什么阿void CTrysocketDlg::OnRecvbn()
{
// TODO: Add your control notification handler code here
CFile myFile;
struct sockaddr_in server;
char dir[]="D:\\worker.txt";
char IPAddr[]="192.168.0.77";
UINT u_port=30001;
SOCKET serSocket;
SOCKET client ;
sockaddr_in fromClient;
char buff[512];
WSADATA wsd;
int wret=WSAStartup(0x101,&wsd);
if(wret)return;
serSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serSocket==INVALID_SOCKET)return;
server.sin_family=AF_INET;
server.sin_port=htons(u_port);
server.sin_addr.s_addr=inet_addr(IPAddr); fromClient.sin_family=AF_INET;
fromClient.sin_port=htons(u_port);
fromClient.sin_addr.s_addr=inet_addr(IPAddr);
if(bind(serSocket,(sockaddr*)&server,sizeof(server))!=0)return;
if(listen(serSocket,10)!=0)return;
int slen=sizeof(fromClient);
client=accept(serSocket,
(struct sockaddr*)&fromClient,&slen);
if(client==INVALID_SOCKET)return;
myFile.Open(dir,CFile::modeCreate|CFile::modeWrite);
int y;
while (y=recv(client,buff,512,0))
{
myFile.Write(buff,y);
}
myFile.Close();
closesocket(serSocket);
closesocket(client);
WSACleanup();}void CTrysocketDlg::OnSendbn()
{
// TODO: Add your control notification handler code here
CFile sendingFile;
struct sockaddr_in sendsocket;
char dir[]="E:\\workingsocket.txt";
char IPAddr[]="192.168.0.77";
UINT u_port=30001;
SOCKET sendingSocket;
char buff[512];
WSADATA wsd;
int wsaret=WSAStartup(0x101,&wsd);
if(wsaret)return;
sendsocket.sin_family=AF_INET;
sendsocket.sin_port=htons(u_port);
sendsocket.sin_addr.s_addr=inet_addr(IPAddr);
sendingSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sendingSocket==INVALID_SOCKET) return;
if(connect(sendingSocket,(struct sockaddr*)&sendsocket,sizeof(sendsocket)))
{
closesocket(sendingSocket);
return;
}
sendingFile.Open(dir,CFile::modeRead);
int y;
while(y=sendingFile.Read(buff,512))
{
send(sendingSocket,buff,y,0);
}
closesocket(sendingSocket);
WSACleanup();
}
{
// TODO: Add your control notification handler code here
CFile myFile;
struct sockaddr_in server;
char dir[]="D:\\worker.txt";
char IPAddr[]="192.168.0.77";
UINT u_port=30001;
SOCKET serSocket;
SOCKET client ;
sockaddr_in fromClient;
char buff[512];
WSADATA wsd;
int wret=WSAStartup(0x101,&wsd);
if(wret)return;
serSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(serSocket==INVALID_SOCKET)return;
server.sin_family=AF_INET;
server.sin_port=htons(u_port);
server.sin_addr.s_addr=inet_addr(IPAddr); fromClient.sin_family=AF_INET;
fromClient.sin_port=htons(u_port);
fromClient.sin_addr.s_addr=inet_addr(IPAddr);
if(bind(serSocket,(sockaddr*)&server,sizeof(server))!=0)return;
if(listen(serSocket,10)!=0)return;
int slen=sizeof(fromClient);
client=accept(serSocket,
(struct sockaddr*)&fromClient,&slen);
if(client==INVALID_SOCKET)return;
myFile.Open(dir,CFile::modeCreate|CFile::modeWrite);
int y;
while (y=recv(client,buff,512,0))
{
myFile.Write(buff,y);
}
myFile.Close();
closesocket(serSocket);
closesocket(client);
WSACleanup();}void CTrysocketDlg::OnSendbn()
{
// TODO: Add your control notification handler code here
CFile sendingFile;
struct sockaddr_in sendsocket;
char dir[]="E:\\workingsocket.txt";
char IPAddr[]="192.168.0.77";
UINT u_port=30001;
SOCKET sendingSocket;
char buff[512];
WSADATA wsd;
int wsaret=WSAStartup(0x101,&wsd);
if(wsaret)return;
sendsocket.sin_family=AF_INET;
sendsocket.sin_port=htons(u_port);
sendsocket.sin_addr.s_addr=inet_addr(IPAddr);
sendingSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sendingSocket==INVALID_SOCKET) return;
if(connect(sendingSocket,(struct sockaddr*)&sendsocket,sizeof(sendsocket)))
{
closesocket(sendingSocket);
return;
}
sendingFile.Open(dir,CFile::modeRead);
int y;
while(y=sendingFile.Read(buff,512))
{
send(sendingSocket,buff,y,0);
}
closesocket(sendingSocket);
WSACleanup();
}
解决方案 »
- 请问要作一个绘图软件,需要自编图形控件,用Java来实现好呢,还是C++好?
- GetDIBits查找特定区域的颜色,求高人指点!
- 急求 SQL语句INSERT INTO 中的字段名可以直接改吗 详细内容见内
- 请教socket编程问题 小弟最近编了一个基于udp的简单程序。。
- 几个小问题,帮忙解答一下
- 能分别采集microphone,line-in吗?
- 小弟请大家喝茶,做题目(在线等待,立马结贴.斑竹不要删贴,这也是学习)
- vc中如何改变标题栏和菜单栏的外观,谢谢!最好能有一些例子程序就好了!
- 为什么HOOK CEdit的EN_CHANGE消息可以,Delphi写的TEdit就hook不到?
- 请高手推荐一本学习WIN32 SDK的比较好的书,最新的
- 在CListView中怎么刷新窗口?
- 如何从图像列表中取一个图形到位图对像中?
typedef struct _SOCKET_STREAM_FILE_INFO { TCHAR szFileTitle[128]; //文件的标题名
DWORD dwFileAttributes; //文件的属性
FILETIME ftCreationTime; //文件的创建时间
FILETIME ftLastAccessTime; //文件的最后访问时间
FILETIME ftLastWriteTime; //文件的最后修改时间
DWORD nFileSizeHigh; //文件大小的高位双字
DWORD nFileSizeLow; //文件大小的低位双字
DWORD dwReserved0; //保留,为0
DWORD dwReserved1; //保留,为0} SOCKET_STREAM_FILE_INFO, * PSOCKET_STREAM_FILE_INFO; 服务器端:
void CServerDlg::OnButtonLicsen() {
// TODO: Add your control notification handler code here
CFileDialog Dlg(TRUE);
if(Dlg.DoModal()!=IDOK)
return;
CFile myFile;
if(!myFile.Open(Dlg.GetPathName(), CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("文件不存在!",MB_OK|MB_ICONERROR);
return;
}
CSocket sockSrvr;
sockSrvr.Create(800); sockSrvr.Listen();
CSocket sockRecv;
sockSrvr.Accept(sockRecv); SOCKET_STREAM_FILE_INFO StreamFileInfo;
WIN32_FIND_DATA FindFileData; FindClose(FindFirstFile(Dlg.GetPathName(),&FindFileData));
memset(&StreamFileInfo,0,sizeof(SOCKET_STREAM_FILE_INFO));
strcpy(StreamFileInfo.szFileTitle,myFile.GetFileTitle()); StreamFileInfo.dwFileAttributes = FindFileData.dwFileAttributes;
StreamFileInfo.ftCreationTime = FindFileData.ftCreationTime;
StreamFileInfo.ftLastAccessTime = FindFileData.ftLastAccessTime;
StreamFileInfo.ftLastWriteTime = FindFileData.ftLastWriteTime;
StreamFileInfo.nFileSizeHigh = FindFileData.nFileSizeHigh;
StreamFileInfo.nFileSizeLow = FindFileData.nFileSizeLow; sockRecv.Send(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO)); UINT dwRead=0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[1024];
UINT dw=myFile.Read(data, 1024);
sockRecv.Send(data, dw);
dwRead+=dw;
}
myFile.Close(); sockRecv.Close();
AfxMessageBox("发送完毕!");
}////////////////////////////////////////////////////
//客户机端:
void CClientDlg::OnButtonSend()
{
// TODO: Add your control notification handler code here
AfxSocketInit(NULL);
CSocket sockClient;
sockClient.Create(); CString szIP; //服务器IP地址
GetDlgItemText(IDC_EDIT_IPADDRESS,szIP); //通过对话框获取服务器IP地址
if(!sockClient.Connect((LPCTSTR)szIP, 800))
{
AfxMessageBox("连接到对方机器失败!");
return;
}
SOCKET_STREAM_FILE_INFO StreamFileInfo;
sockClient.Receive(&StreamFileInfo,sizeof(SOCKET_STREAM_FILE_INFO)); CFile destFile(StreamFileInfo.szFileTitle,
CFile::modeCreate | CFile::modeWrite | CFile::typeBinary); UINT dwRead = 0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[1024];
memset(data,0,1024); UINT dw=sockClient.Receive(data, 1024);
destFile.Write(data, dw); dwRead+=dw;
} SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
destFile.Close();
SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
sockClient.Close();
AfxMessageBox("接收完毕!");
}
比如:
while (y=recv(client,buff,512,0)),而recv返回值有可能是已经接收的字符串的数目,也有可能返回的是错误代码。你应该用GetLastError看一看是不是你的网络初始化失败,或者是其它什么原因,错误代码都是非0值,具体意义在MSDN文档中可以查询。