流云飞水 2015-07-29 08:47 采纳率: 50%
浏览 2264
已采纳

C++Socket网络连接问题

在用C++编程时,使用socket,在本机上自我链接成功,无论是127.0.0.1还是真实ip都可以连接成功,而在两台电脑 之间就会失败, 求指教,可能会发生什么问题, 以下是源代码
void * JoinScene::thread_funcation(void arg)
{
/
客户端编程*/
log("ip:%s",AimIp);
WORD wVersionRequested;
WSADATA wsaData; //用于接受Windows Socket 的结构信息
int err;
wVersionRequested = MAKEWORD(1,1); //请求1.1版本的windows 库
err = WSAStartup(wVersionRequested,&wsaData);
if (err !=0)
{
log("I'm failed at first return");
return NULL;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
WSACleanup(); // 否则用这个函数清除信息,结束
log("I'm failed at second return");
return NULL;
}
socket_fd = socket(AF_INET,SOCK_STREAM,0);
if (-1 == socket_fd){
log("client socket falid");
return NULL;
}
sockaddr_in setverAddress; //服务器的地址
setverAddress.sin_port = htons(8888); //iP
setverAddress.sin_family = AF_INET;
setverAddress.sin_addr.S_un.S_addr = inet_addr(AimIp);
int connect_fd = connect(socket_fd,(sockaddr *)&setverAddress,sizeof(setverAddress));
if (connect_fd == -1){
log("contect falid ");
return NULL;
}
int x = 0;
while (true)
{
if(sendData[0] == 'Y')
{
int sendLenght = send(socket_fd,sendData,100,0);
sendData[0] = 'N';
if (sendLenght == -1){
log("send falid");
}

}
if(firstTime)
{
int receLen = recv(socket_fd,receData,100,0);
firstTime = false;
}else
{
recv(socket_fd,Turn,100,0);
recv(socket_fd,receTag,100,0);
recv(socket_fd,receXP,100,0);
recv(socket_fd,receYP,100,0);
}

log("%s",receData);    // 输出服务器传过来的
log("tag %s",receTag);    // 输出服务器传过来的
log("Xp %s",receXP);    // 输出服务器传过来的
log("Yp %s",receYP);    // 输出服务器传过来的
}   
return NULL;

}

void JoinScene::startGame(float dt)
{
if(receData[1] == 's')
{
Director::getInstance()->replaceScene(ParticipateScene::createScene());
}
}
/*将数据处理为网络可传输格式*/
void JoinScene::DataFactory(int tag,float xPosition,float yPosition)
{
sprintf(SendTag,"%d",tag);
gcvt(xPosition,99,SendXP);
gcvt(yPosition,99,SendYP);
log("%s",SendTag);
log("%s",SendXP);
log("%s",SendYP);
SentMessage();
}
/*将网络数据转化为可用的int型*/
int JoinScene::IntFactory()
{
int x = atoi(receTag);
// log("Stoint %d",x);
return x;
}

服务端
// 需要线程来完成的功能都写在这个函数里
void * CreateScene::thread_funcation(void arg)
{
/
实现通过套接字进行网络联接*/
WORD wVersionRequested;
WSADATA wsaData; //用于接受Windows Socket 的结构信息
int err;
wVersionRequested = MAKEWORD(1,1); //请求1.1版本的windows 库
err = WSAStartup(wVersionRequested,&wsaData);
if (err !=0)
{
log("I don't Know");
return NULL;
}
if (LOBYTE(wsaData.wVersion)!=1 || HIBYTE(wsaData.wVersion)!=1){
WSACleanup(); // 否则用这个函数清除信息,结束
log("why!!");
return NULL;
}
int socket_fd = socket(AF_INET,SOCK_STREAM,0);//类型、流式、协议
if (socket_fd == -1){//如果socket返回 -1就 返回,防止崩。。。。
log("sorry...");
return NULL;
}
sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET; //一般来说AF_INET(地址族)PF_INET(协议族)
serverAddress.sin_addr.S_un.S_addr = INADDR_ANY;
serverAddress.sin_port = htons(6666); //必须 加上 htons
int bind_fd = bind(socket_fd,(sockaddr*)(&serverAddress),sizeof(serverAddress));
if (bind_fd == -1){
log("sorry bind failed");
return NULL;
}
if (listen(socket_fd,2) == -1){
log("Listen Failed");
return NULL;
}
sockaddr_in clientAddress;
int s = sizeof(clientAddress);
client_fd = accept(socket_fd,(sockaddr *)&clientAddress,&s);
if (client_fd == -1){
log("accept Failed");
return NULL;
}

while(true)
{
    if(firstTime)
{
int recv_data = recv(client_fd,buf,100,0);
if (recv_data == -1){
    log("receive failed");
}else if(recv_data == 0)
{
    closesocket(socket_fd);
}else
{
    log("here receive %s",buf);     
}   
firstTime = false;
}else
{
recv(client_fd,TurnReceive,100,0);
recv(client_fd,bufTag,100,0);
recv(client_fd,bufXP,100,0);
recv(client_fd,bufYP,100,0);
log("here receive turnreceive %s %d",TurnReceive,bufTag);
}

if(sentData[0]=='Y')
    {
        int sendLenght = send(client_fd,sentData,100,0);
        sentData[0] = 'N';
        if (sendLenght == -1){
        log("send falid");
    }
    }       
}

return NULL;
}

展开全部

  • 写回答

4条回答 默认 最新

  • threenewbee 2015-07-29 14:02
    关注

    用sniffer pro看下,是不是根本没有收到,检查防火墙的设置。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 Mysql 一张表同时多人查询和插入怎么防止死锁
  • ¥20 centos6.7 安装libevent库.总是报错,如何解决?
  • ¥15 电脑买回,学校的有线网络总掉。
  • ¥20 关于普洛菲斯触摸屏与AB连接地址问题
  • ¥15 vue但是页面显示的数据为空为什么呀,明明在钩子函数中已经成功赋值(相关搜索:输出数据)
  • ¥15 syri可视化不显示插入缺失
  • ¥30 运行软件卡死查看系统日志分析不出来
  • ¥15 C语言代码改正特征选择算法设计,贝叶斯决策,,设计分类器,远程操作代码修正一下
  • ¥15 String 类valuve指向的问题
  • ¥15 在ros2的iron版本进行编译时遇到如下问题
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部