c++用socket发送消息和文件。
只是在接收端,我的电脑接受消息时会先出现一段乱码,再出现应该发送的信息,但是其他电脑都不会,为什么会这样~~~~
发送端:
#include<WinSock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32.lib")
using namespace std;void main(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"Winsock初始化失败。"<<endl;
return;
} SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5150); if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==SOCKET_ERROR)
{
cout<<"绑定出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"绑定成功。"<<endl; if(listen(sockSrv,5)==SOCKET_ERROR)
{
cout<<"监听出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"监听成功。"<<endl; SOCKET SockConn;
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); SockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len); if(SockConn == INVALID_SOCKET)
{
cout<<"接受出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"接受成功。"<<endl;
char sendbufMess[1024];
memset(sendbufMess,0,sizeof(sendbufMess));
sprintf(sendbufMess,"你好!!欢迎来到IP为%s的服务器。",inet_ntoa(addrClient.sin_addr));
send(SockConn,sendbufMess,strlen(sendbufMess)+1,0);
char recvbuf[1024];
recv(SockConn,recvbuf,strlen(recvbuf),0);
cout<<recvbuf<<endl; char sendbuf[1024];
DWORD dwRead;
BOOL bRet;
char filename[64];
char filepath[128];
cout<<"请输入文件名(例如:example.txt):";
cin>>filename;
send(SockConn,filename,strlen(filename)+1,0);
cout<<"请输入文件的绝对路径(例如:d:\\\\example.txt):";
cin>>filepath;
HANDLE hFile=CreateFileA(filepath,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
while(true)
{
bRet=ReadFile(hFile,sendbuf,1024,&dwRead,NULL);
if(bRet==FALSE)
{
cout<<"文件读取错误。"<<endl;
break;
}
else if(dwRead==0)
{
cout<<"文件发送成功。"<<endl;
break;
}
else
{
send(SockConn,sendbuf,dwRead,0);
}
} closesocket(SockConn);
closesocket(sockSrv); WSACleanup();
system("pause");
}接收端:
#include<WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;void main(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"Winsock初始化失败。"<<endl;
return;
} SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); char ip_addr[16]={"127.0.0.1"};
char choice;
cout<<"客户端与服务器是不是同一部计算机(Y/N)"<<endl;
cin>>choice;
if(choice=='N')
{
cout<<"请输入服务器的IP地址:";
cin>>ip_addr;
}
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr(ip_addr);
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(5150); if(connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout<<"连接出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"连接成功。"<<endl;
char recvbufMess[1024];
recv(sockClient,recvbufMess,1024,0);
cout<<recvbufMess<<endl;
char sendbuf[1024];
memset(sendbuf,0,sizeof(sendbuf));
sprintf(sendbuf,"你好!!这是来自IP为%s的客户端。已经成功从服务器接收信息。",inet_ntoa(addrClient.sin_addr));
send(sockClient,sendbuf,strlen(sendbuf)+1,0); char recvbuf[1024];
int count=0,size=0;
DWORD dwWrite;
BOOL bRet;
char filename[64];
char filepath[128];
recv(sockClient,filename,strlen(filename)+1,0);
cout<<"要发送的文件的文件名为:"<<filename<<endl;
cout<<"请输入要存放文件的绝对路径(例如:d:\\\\examplefolder\\\\上面显示的文件名):"<<endl;
cin>>filepath;
HANDLE hFile=CreateFileA(filepath,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
while(true)
{
size=recv(sockClient,recvbuf,1024,0);
count=size+count;
bRet=WriteFile(hFile,recvbuf,size,&dwWrite,NULL);
if(bRet==FALSE)
{
cout<<"文件写入错误。"<<endl;
break;
}
else if(size==0)
{
cout<<"文件接受完毕。"<<endl;
cout<<"文件的大小为"<<count<<"字节。"<<endl;
break;
}
} closesocket(sockClient);
WSACleanup(); system("pause");
}出现的乱码是"Drco括",无论发送什么消息都会是这样
不过只要char recvbufMess[1024];
recv(sockClient,recvbufMess,1024,0);
后面再加一句recv(sockClient,recvbufMess,1024,0);我的电脑就不会有事,可这样其他电脑就运行不了了~~
只是在接收端,我的电脑接受消息时会先出现一段乱码,再出现应该发送的信息,但是其他电脑都不会,为什么会这样~~~~
发送端:
#include<WinSock2.h>
#include<iostream>
#pragma comment (lib,"ws2_32.lib")
using namespace std;void main(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"Winsock初始化失败。"<<endl;
return;
} SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5150); if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==SOCKET_ERROR)
{
cout<<"绑定出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"绑定成功。"<<endl; if(listen(sockSrv,5)==SOCKET_ERROR)
{
cout<<"监听出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"监听成功。"<<endl; SOCKET SockConn;
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); SockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len); if(SockConn == INVALID_SOCKET)
{
cout<<"接受出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"接受成功。"<<endl;
char sendbufMess[1024];
memset(sendbufMess,0,sizeof(sendbufMess));
sprintf(sendbufMess,"你好!!欢迎来到IP为%s的服务器。",inet_ntoa(addrClient.sin_addr));
send(SockConn,sendbufMess,strlen(sendbufMess)+1,0);
char recvbuf[1024];
recv(SockConn,recvbuf,strlen(recvbuf),0);
cout<<recvbuf<<endl; char sendbuf[1024];
DWORD dwRead;
BOOL bRet;
char filename[64];
char filepath[128];
cout<<"请输入文件名(例如:example.txt):";
cin>>filename;
send(SockConn,filename,strlen(filename)+1,0);
cout<<"请输入文件的绝对路径(例如:d:\\\\example.txt):";
cin>>filepath;
HANDLE hFile=CreateFileA(filepath,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
while(true)
{
bRet=ReadFile(hFile,sendbuf,1024,&dwRead,NULL);
if(bRet==FALSE)
{
cout<<"文件读取错误。"<<endl;
break;
}
else if(dwRead==0)
{
cout<<"文件发送成功。"<<endl;
break;
}
else
{
send(SockConn,sendbuf,dwRead,0);
}
} closesocket(SockConn);
closesocket(sockSrv); WSACleanup();
system("pause");
}接收端:
#include<WinSock2.h>
#include<iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;void main(void)
{
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
cout<<"Winsock初始化失败。"<<endl;
return;
} SOCKET sockClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); char ip_addr[16]={"127.0.0.1"};
char choice;
cout<<"客户端与服务器是不是同一部计算机(Y/N)"<<endl;
cin>>choice;
if(choice=='N')
{
cout<<"请输入服务器的IP地址:";
cin>>ip_addr;
}
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr(ip_addr);
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(5150); if(connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR)) == SOCKET_ERROR)
{
cout<<"连接出错。"<<endl;
cout<<WSAGetLastError()<<endl;
WSACleanup();
return;
}
else
cout<<"连接成功。"<<endl;
char recvbufMess[1024];
recv(sockClient,recvbufMess,1024,0);
cout<<recvbufMess<<endl;
char sendbuf[1024];
memset(sendbuf,0,sizeof(sendbuf));
sprintf(sendbuf,"你好!!这是来自IP为%s的客户端。已经成功从服务器接收信息。",inet_ntoa(addrClient.sin_addr));
send(sockClient,sendbuf,strlen(sendbuf)+1,0); char recvbuf[1024];
int count=0,size=0;
DWORD dwWrite;
BOOL bRet;
char filename[64];
char filepath[128];
recv(sockClient,filename,strlen(filename)+1,0);
cout<<"要发送的文件的文件名为:"<<filename<<endl;
cout<<"请输入要存放文件的绝对路径(例如:d:\\\\examplefolder\\\\上面显示的文件名):"<<endl;
cin>>filepath;
HANDLE hFile=CreateFileA(filepath,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
while(true)
{
size=recv(sockClient,recvbuf,1024,0);
count=size+count;
bRet=WriteFile(hFile,recvbuf,size,&dwWrite,NULL);
if(bRet==FALSE)
{
cout<<"文件写入错误。"<<endl;
break;
}
else if(size==0)
{
cout<<"文件接受完毕。"<<endl;
cout<<"文件的大小为"<<count<<"字节。"<<endl;
break;
}
} closesocket(sockClient);
WSACleanup(); system("pause");
}出现的乱码是"Drco括",无论发送什么消息都会是这样
不过只要char recvbufMess[1024];
recv(sockClient,recvbufMess,1024,0);
后面再加一句recv(sockClient,recvbufMess,1024,0);我的电脑就不会有事,可这样其他电脑就运行不了了~~
解决方案 »
- 在其它对话框的线程函数中获取主对话框的指针!!!
- 怎样升级现在的vs2008到vs2008 SP1?
- 急招程序员一个(上海)
- 在树型控件中,为什么我用GetSelectedItem()函数,获得到不是当前选中结点,而是上次选中结点?
- 各位大虾出手相救了!!如何可以得到webbrowser控件的滚动条!!!!急
- :::..:::关于CDateTimeCtrl::SetTime的一个问题
- 怎样用程序设置文件夹共享?
- 关于坐标转化的问题
- 怎样动态把本地Access数据库.mdb连到RemoteData上啊?不用odbc.
- 如何 让IE自动最大化?
- ATL的DLL使用多字符集编译时出现多种问题//只能用unicode码呀?
- 数组截取问题
http://download.csdn.net/detail/geoff08zhang/4571358
一般可以用一个字符约定,当接收到这个字符就break;