问题是当我定义了一个多线程的接受和发送信息,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);
}
}
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);
}
}
而且你的接收和发送都只是一次的,要改成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);
}}
{
HANDLE thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL);
HANDLE thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL);
}
有必要这样么- - 不一会系统资源就给你用光了.
{
HANDLE thread2=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)send2,NULL,0,NULL);
HANDLE thread3=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)recv3,NULL,0,NULL);
}
循环不断的创建线程