我在php服务端写了个服务程序,
<?php
$socket = socket_create(AF_INET, SOCK_STREAM,0);//SOL_TCP);//产生一个socket并且返回一个socket资源的实例
socket_bind($socket, '60.191.93.66', 1337);//绑定socket到本地计算机
socket_listen($socket);//监听所有进来的socket连接
// Initialize the buffer
$buffer = "v1\0";//\0表示结束符,用ok表示mytool软件版本过期
$i=0;
while(1) {
// Accept any connections coming in on this socket
$t=date("Y-m-d H:i:s");
$connection = socket_accept($socket);//socket_accept()    接受一个Socket连接
if ($connection>0) printf("Socket connected\r\n");
// Check to see if there is anything in the buffer
printf("连接完成,等待数据: ".$t."Buffer: " . $buffer . "\r\n");
if($buffer != ""){
// printf("Something is in the buffer...sending data...\r\n");
socket_write($connection, $buffer . "\r\n"); //socket_write()写数据到socket缓存
//printf("Wrote to socket\r\n");
}else {
       printf("No Data in the buffer\r\n");
}
// Get the input $timetemp=$t;

while($data = socket_read($connection, 1024, PHP_NORMAL_READ))//socket_read()读取指定长度的数据
{
$t=date("Y-m-d H:i:s");
printf("收到数据: ".$t."Buff: ".$data."socketerror=".socket_last_error()."\r\n");
    
}
   
}
socket_close($connection); //socket_close()     关闭一个socket资源
socket_close($socket); //socket_close()     关闭一个socket资源
?>在客户端用VC在同一个Project中写了二连接程序
在a.cpp文件中(总是先执行)
act=connect(sockd,(const sockaddr*)&remote,sizeof(remote));//sockd是局部变量
resultRecv=send(sockd,"fffv1fffcheckinfff\n",20,0);
closesocket(sockd);//如果加上这句,则b.cpp发送的信息能够接收到,没有这句,则b.cpp发送的信息接收不到。
在b.cpp文件中(总是后执行)
void CMainFrame::OnClose() //为了在程序退出时,强制连接服务器端

act=connect(sockd,(const sockaddr*)&remote,sizeof(remote));
int a=send(sockd,"fffv1fffcheckoutfff\n",21,0);
  CFrameWnd::OnClose(); 
}
运行后发现奇怪的现象。服务器端能够与二个文件的socket建立连接,但只能接收到a.cpp文件中传过来的信息fffv1fffcheckinfff。而接收不到b.cpp文件传送的信息。如果在a.cpp中加上closesocket(sockd),则a.cpp文件中传过来的信息收不到,而b.cpp中的信息fffv1fffcheckoutfff却能收到了,这是怎么回事?怎么做才能接收到两个文件传送的信息。

解决方案 »

  1.   

    while($data = socket_read($connection, 1024, PHP_NORMAL_READ))
    换成
    while(($data = socket_read($connection, 1024, PHP_NORMAL_READ)) != "")
      

  2.   

    不行啊,连正常的数据都接收不到了。
    问题在于,为什么服务器端程序只能接收到一个文件传送的信息,另一个文件建立socket连接,却不能收到信息,除非前一个socket链接先断掉,但前一个链接先断掉,前一个文件a.cpp发送的信息反而接收不到了。