问题是当我定义了一个多线程的接受和发送信息,1,当我把数组放进去的时候就会严重失误,
2,而当我把数组放到外面来的时候尽管能发送接收当有时同时发出相同的数据对方就接受不到。
请高手帮我看一下,在这个基础上帮我修改下,我希望知道病症所在,
感激不尽。
//init.h
#include<winsock2.h>
#pragma comment(lib,"WS2_32")
class CInitsock{
public:
   CInitsock(byte ver,byte ver2)
   {
   WSADATA WSA;
   WORD W=MAKEWORD(ver,ver2);
   ::WSAStartup(W,&WSA);
   }
   ~CInitsock(){
  ::WSACleanup();
   }
};客户端:
#include<stdio.h>
#include"initsock.h"
#include<iostream.h>
CInitsock sock(2,2);
   SOCKET S;
void send2(){
     char b[1000];
     scanf("%s",b);
::send(S,b,strlen(b),0); 
}void recv3(){
char text[1000];    int y=recv(S,text,256,0);
   if(y>0)
   {
printf("接受到数据:%s\n",text);
   }
  /**/
} int main(){
 S=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
sockaddr_in  server;
server.sin_family=AF_INET;
server.sin_port=htons(4567);
server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
if(::connect(S,(LPSOCKADDR)&server,sizeof(server))==-1)
{printf("faile connect"); return 0;
}

while(1)
{
HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL);
HANDLE  thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL);
}
}
主机:
#include<stdio.h>
#include"initsock.h"
#include<iostream.h>
CInitsock sock(2,2);
   SOCKET s;
void send1()
{   char te[1000];
   scanf("%s",te);
::send(s,te,strlen(te),0);
 
}
void recv2()
{char text[1000];int k=::recv(s,text,256,0);
if(k>0)
printf("接受到数据:%s\n",text);
     
}
int main(){
SOCKET listens=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(listens==INVALID_SOCKET){
printf("creat fail");
    return 0;
}
sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
    sin.sin_addr.S_un.S_addr=INADDR_ANY;
if(::bind(listens,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
{ printf("fail");
 return 0;
}
::listen(listens,2);
   sockaddr_in in;
   int lenth=sizeof(in);   s=::accept(listens,(sockaddr*)&in,&lenth);
   if(s==INVALID_SOCKET)
   {
   printf("fail lianjie");
return 0;
}
printf("jieshoudaoyigelianjie:%s\r\n",inet_ntoa(in.sin_addr));
while(1)
{
HANDLE  thread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send1,NULL,0,NULL);
HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv2,NULL,0,NULL);
   
}
}

解决方案 »

  1.   

    我不知道你的程序是怎么通过的!!!你的服务端和客户端在不断的建立多线程,我就不相信,你的机子不越来越卡!
    而且你的接收和发送都只是一次的,要改成while(true),我帮你修改了一下,你自己看一下!服务端的:(没添加ws2_32.lib,自己添加)#include <stdio.h> 
    #include <windows.h>
    SOCKET s;
    void send1() 
    {   while(true)
    {
    char te[256]; 
       scanf("%s",te); 
    ::send(s,te,strlen(te)+1,0); 
      }

    void recv2() 
    {
    while(true)
    {
    char text[256]; int k=::recv(s,text,256,0); 
    if(k>0) 
    {
    text[k]='\0';
    printf("接受到数据:%s\n",text);

    }
          

    int main()
    {
    WSADATA WSA;
    WORD W=MAKEWORD(2,2); 
    WSAStartup(W,&WSA);SOCKET listens=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    if(listens==INVALID_SOCKET)

    printf("creat fail"); 
        return 0; 

    sockaddr_in sin; 
    sin.sin_family=AF_INET; 
    sin.sin_port=htons(4567); 
        sin.sin_addr.S_un.S_addr=INADDR_ANY; 
    if(::bind(listens,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR) 
    { printf("fail"); 
     return 0; 

    ::listen(listens,2); 
       sockaddr_in in; 
       int lenth=sizeof(in); 
    HANDLE  thread1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send1,NULL,0,NULL); 
    HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv2,NULL,0,NULL); 
    while(true)
    {
       s=::accept(listens,(sockaddr*)&in,&lenth); 
       if(s==INVALID_SOCKET) 
       { 
       printf("fail lianjie"); 
    return 0; 

    printf("jieshoudaoyigelianjie:%s\r\n",inet_ntoa(in.sin_addr));
    }
    return 0; 

    客户端的:#include <stdio.h> 
    #include <windows.h> 
    SOCKET S; 
    void send2(){ 
    while(true)
    {
         char b[256]; 
         scanf("%s",b); 
    ::send(S,b,strlen(b),0);
    }   
    } void recv3(){
    while(true)
    {
    char text[256];     int y=recv(S,text,256,0); 
       if(y>0) 
       { 
       text[y]='\0';
    printf("接受到数据:%s\n",text); 
       } 
    }
      /**/ 
    }  int main()
     { 
     WSADATA WSA; 
       WORD W=MAKEWORD(2,2); 
       WSAStartup(W,&WSA);  S=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
    sockaddr_in  server; 
    server.sin_family=AF_INET; 
    server.sin_port=htons(4567); 
    server.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); 
    if(::connect(S,(LPSOCKADDR)&server,sizeof(server))==-1) 
    {printf("faile connect"); return 0; 

    HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL); 
    HANDLE  thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL); 
    while(true)
    {
    Sleep(10);
    }} 
      

  2.   

    while(1) 

    HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL); 
    HANDLE  thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL); 

    有必要这样么- - 不一会系统资源就给你用光了.
      

  3.   

    while(1) 

    HANDLE  thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL); 
    HANDLE  thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL); 

    循环不断的创建线程