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);我的电脑就不会有事,可这样其他电脑就运行不了了~~

解决方案 »

  1.   

    TCP 分包了吧,第一次没收全,这个和路由,换机,操作系统等有关如果是TCP连接,你应该自已有开始头和束尾,好标识一个完整的消息完成了
      

  2.   

    我是新手,请问是不是要用while(true)来接受几次,然后当接收完成后调出while
      

  3.   

    TCP发送的都是数据流,只要双方协商好怎样处理就行.这里有些WinSock调试没问题的代码,请对照检查你的程序:
    http://download.csdn.net/detail/geoff08zhang/4571358
      

  4.   

    循环接收,根据返回值判断是否收完毕,完毕之后就break
      

  5.   

    在你自己电脑上没问题吧应该?
    一般可以用一个字符约定,当接收到这个字符就break;