#include <winsock2.h>
#include<stdio.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
WSAStartup(WINSOCK_VERSION,&wsaData); 

SOCKET sock = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in to;
memset(&to, 0 , sizeof(to));

to.sin_addr.s_addr = inet_addr("92.0.0.27");//服务器程序在本地
to.sin_family = AF_INET;
to.sin_port = htons(8888); //server 的 PORT

int ret = connect(sock, (struct sockaddr*) &to, sizeof(to));

char connectChar[] = "92.0.0.27@#SEND@#92.0.0.27@#SEND@#10@#0@#1@#A@#\n";
send(sock, connectChar,strlen(connectChar),1);

char sendData[] = "92.0.0.27@#SEND@#92.0.0.27@#RECV@#0@#0@#7@#abcdefg@#\n";

int flag = 0;
while(1)
{
int retSend = send(sock, sendData,strlen(sendData),0);

if(retSend == SOCKET_ERROR)
{
break;
closesocket(sock);
}
else
{
//printf("%s",sendData);
printf("%d\n",flag++);
}
}
          printf("sdfsdfsdfsdddddddddddddddd");
WSACleanup();
return 0;
}客户端编程的一个小问题,为什么发送数据的时候发送1000多条的时候程序不运行了
这里我将flag跟踪,当flag变到1239时,程序好像出现了一些想不到的错误,在flag
变成1239次时,也就是说客户端往服务器发送了1000多条数据后,程序停在了while循环中
因为我并没有看到printf("sdfsdfsdfsdddddddddddddddd“);这条程序的执行,调试程序我将断点设在printf("sdfsdfsdfsdddddddddddddddd),也是没有运行到
请问这是怎么回事,服务我该怎么样调试这样的程序
谢谢

解决方案 »

  1.   

    估计数据太多导致溢出,产生错误,客户端已经被close,可以检查errno值
      

  2.   

    原则上没啥错误,只是 break;                  两句写反了,应该倒过来。不然
    closesocket(sock);
    closesocket()永远执行不了。到不了printf是因为卡在while里了。while中只有可能卡在send。你的循环是连续执行的,没有间隔,所以很可能是发的太快了,发送速度超过了服务器读取的速度,接收窗口收缩为0。不过即使这样的话,当服务器喘口气的时候窗口也会慢慢打开一点,不至于完全死住。楼主可以观察时间长点,看看是完全死住了,还是执行很慢而已,估计很可能后者。不然的话,就是服务器段累死掉了。建议在两次发送之间加延时,sleep(100)
      

  3.   

    上楼的大哥说的很对,确实是在send上卡住了
    可是现在我的服务器程序好像没有错误
    我对send后的结果进行检测,每次当发送到1239时,程序确实是卡在了send上,这时程序不在执行了
    当我将服务器程序关掉后,后面的就可以执行了
    请问这是我的服务器程序出错了吗?
    我这可是加上了sleep了而实现同样功能的vb程序,却可以运行一天,这是我的服务器程序出问题了吗?
      

  4.   

    是用线程也不行
    请问该怎么解决
    难道是我的服务程序当掉了吗?
    不会啊
    在卡在send的时候,我使用vb的客户端去访问服务器
    还是可以的
    这到底是怎么回事
      

  5.   

    其实你的程序都没有死,而是像 halk(不当老大已经很久了) 说的那样,是由于客户端发送的速度过快,而是服务器端来不及接受,从而使服务器端的接收窗口收缩为0。你要等一段时间的。
    还有你检查一下服务器端的接收情况,照你的程序看,很可能是服务器端接收的时候遇到了问题,从而使接收窗口不能变大,导致客户端不能发送数据。
      

  6.   

    请问我 怎么样在程序中修改和检测你说的这个接受窗口可是现在当程序卡在send的时候,这时我在使用其他的测试程序去访问我的服务器,
    是可以接受数据的,这是不是说明我的服务器程序是没有问题的
      

  7.   

    halk(不当老大已经很久了) 说的应该是没错,除了刚才提到的错误,就是在循环中增加暂停!
      

  8.   

    最简单的办法,服务器每次收到数据都发送一个ECHO,客户端收到ECHO之后再发一个包。
      

  9.   

    halk(不当老大已经很久了)
    服务器端是使用完成端口来做的,
    我将客户端发送的时间间隔调成一秒都不行
    为什么?
    是怎么回事
    实在是调不出来
      

  10.   

    完成端口,应该没啥问题的。间隔1秒都发不出?那发送速度也不是问题了。问题在哪儿……………………sorry,水平有限^_^