sinat_35792048 2016-08-10 13:38 采纳率: 0%
浏览 942

求助各路神仙,关于TCP通信的小程序

int clk=0;
int a=1;
char recvBuf[100];
char sendBuf[100];
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

void HDlg::OnBnClickedhaoyou()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
    return;}

if(LOBYTE(wsaData.wVersion)!=1||
    HIBYTE(wsaData.wVersion)!=1){
        WSACleanup();
        return;}

SOCKADDR_IN addrsrv;
addrsrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");     
addrsrv.sin_family=AF_INET;
addrsrv.sin_port=htons(8888);

connect(sockClient,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR));            //以上部分创建套接字建立连接等工作*/

//  SetTimer(1,500,NULL);
//  OnTimer(a);
recv(sockClient,recvBuf,100,0);
MessageBox(recvBuf);

}

void HDlg::OnBnClickedFasong()
{
clk=1; // TODO: 在此添加控件通知处理程序代码
}

void HDlg::OnTimer(UINT_PTR nIDEvent)
{
recv(sockClient,recvBuf,100,0);
MessageBox(recvBuf);
if(recvBuf[0]!='\0')
{temp.Format("%s",recvBuf);
m_xianshi=m_xianshi+"对方说:\r\n";
m_xianshi=m_xianshi+temp; UpdateData(false);}

// TODO: 在此添加消息处理程序代码和/或调用默认值
if(clk==1) //发送模块
{
clk=0;
UpdateData(true);
char *sendBuf=m_input.GetBuffer(0);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);
temp.Format("%s",sendBuf);
m_xianshi=m_xianshi+"你说:\r\n";
m_xianshi=m_xianshi+temp+"\r\n";
m_input="";
UpdateData(false);}
CDialogEx::OnTimer(nIDEvent);

}

 分割线------------------------------------------------------------------------------------------下面是服务端的代码

int clk=0;
int a=1;
char recvBuf[100];
char sendBuf[100];
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);

void HDlg::OnBnClickedhaoyou()
{
m_IP.GetWindowTextA(m_str);
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD(1,1);

err = WSAStartup(wVersionRequested,&wsaData);
if(err!=0){
    MessageBox("获取版本信息失败!");
    return;}

if(LOBYTE(wsaData.wVersion)!=1||
    HIBYTE(wsaData.wVersion)!=1){
    WSACleanup();
        return;}

SOCKADDR_IN addrsrv;
addrsrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);      //监听对象是所有的IP
addrsrv.sin_family=AF_INET;
addrsrv.sin_port=htons(8888);

bind(sockSrv,(SOCKADDR*)&addrsrv,sizeof(SOCKADDR));
listen(sockSrv,5);

                     //以上部分创建套接字建立连接等工作*/

    SetTimer(1,500,NULL);
    OnTimer(a);

}

void HDlg::OnBnClickedFasong()
{
clk=1; // TODO: 在此添加控件通知处理程序代码
}

void HDlg::OnTimer(UINT_PTR nIDEvent)
{
SOCKET sockconn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
sprintf(sendBuf,"wlecome!",inet_ntoa(addrClient.sin_addr));
send(sockconn,sendBuf,strlen(sendBuf)+1,0);
MessageBox(sendBuf);
recv(sockconn,recvBuf,100,0);
if('q'==recvBuf[0])
{
sendto(sockSrv,"q",strlen("1")+1,0,(SOCKADDR*)&addrClient,len);
closesocket(sockSrv);
WSACleanup();
}
if(recvBuf[0]!='\0')
{temp.Format("%s",recvBuf);
MessageBox(recvBuf);
m_xianshi=m_xianshi+"对方说:\r\n";
m_xianshi=m_xianshi+temp; UpdateData(false);}

// TODO: 在此添加消息处理程序代码和/或调用默认值
if(clk==1) //发送模块
{
clk=0;
UpdateData(true);
char *sendBuf=m_input.GetBuffer(0);
send(sockconn,sendBuf,strlen(sendBuf)+1,0);
temp.Format("%s",sendBuf);
m_xianshi=m_xianshi+"你说:\r\n";
m_xianshi=m_xianshi+temp+"\r\n";
m_input="";
UpdateData(false);}
CDialogEx::OnTimer(nIDEvent);

}

我就是想实现类似QQ那样的聊天过程  之前写过类似的控制台的小程序  可以运行  但是这次这个一直没搞懂哪儿有问题   程序没有报错   但是双方的数据什么的都没有发送成功   实在找不出啥状况了   求助各位大神指点指点   其中出现的MESSAGEBOX是用来测试的不用在意
  • 写回答

1条回答

  • 普通网友 2016-08-10 16:16
    关注

    建议你在程序里加日志,自己试着调试一下,首先既然是通信程序通信失败,最有可能的就是建立连接的地方,在创建socket和开始监听和开始发送的地方,
    看看函数返回值是否正常,如果不正常,应该把socket的错误号显示出来,然后分析是什么原因,是端口被占用,还是因为没有网络权限拒绝访问等等等等,都有可能。
    有了具体错误号或者知道具体错误的地方,问题不就解决了一大半了吗?

    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大