//server side
void* s2(void *arg){
info *s = (info*)arg;
char buffer[MAXS];
int k;
sockaddr_in addr;
socklen_t aSize = sizeof(sockaddr_in);
int sfd = accept(s->fd,(sockaddr*)&addr,(socklen_t*)&aSize);
if(sfd<0){
s->current--;
pthread_exit(0);
}
while(1){
k = recv(sfd,buffer,MAXS,0);
cout<<buffer<<"\n";
//1. k ==0 socket has been closed by client
//2. k==-1 error in recv
//3. recv quit
if((k==-1)||(!strncmp(buffer,"quit",4))||(k==0))break;
sprintf(buffer,"%d\n",(int)strlen(buffer)); //Convert length to string using sprintf()
send(sfd,buffer,strlen(buffer),0); //send buffer to client
}
close(sfd);
if(s->limit==s->current)
FD_SET(s->fd,&sfds);
s->current--; //decreament the client number
pthread_exit(0);
}
//client side
1. send(sockfd,"sadhdag",8,0);
2. send(sockfd,"ss",3,0);
Сервер recv sadhdag
при первом вызове recv .
При втором вызове сервера recv recv
ss
dag
серверная часть:
функция s2 запускается потоком, и аргумент передается с информацией о сокете, соединение принимается там, а send и recv вызываются на вновь принятом клиенте.
Почему это происходит? или как этого избежать?
recv()
? - person Karthik Kalyanasundaram   schedule 26.02.2015memset
buffer
до 0 перед каждымrecv
вызовом.memset(buffer, 0, MAXS)
. - person Karthik Kalyanasundaram   schedule 26.02.2015memset
сбросит данные, которые сейчас хранятся в вашемbuffer
(т.е. удалит ранее считанные данные). В соответствии с вашим кодом вам не нужно вызыватьmemset
, так как после 2-гоrecv
вашbuffer
должен выглядеть так|s|s|\0|h|d|a|g|\0|
, и когда вы выполняете cout‹‹buffer‹‹\n, он должен печатать содержимое до первого нулевого символа и только сс должны быть напечатаны. Если вы используете Visual Studio, можете ли вы просто проверить содержимое в буфере с помощью Quick Watch и убедиться, что в вашем буфере есть «\ 0» после «S», «S» - person Karthik Kalyanasundaram   schedule 26.02.2015send(sockfd,"ss",3,0)
, он отправляет 3 байта, и я надеюсь, что это также должно отправлять нулевой терминатор. - person Karthik Kalyanasundaram   schedule 26.02.2015\0
в конце. Когда вы говорите отправить 3 байта, он должен отправить|s|s|\0|
- person Karthik Kalyanasundaram   schedule 26.02.2015|S|S|\0
,recv
также должен получать те же данные, верно? а данные в вызовеbuffer
послеrecv
должны были быть|s|s|\0|....
- person Karthik Kalyanasundaram   schedule 26.02.2015