PDA

View Full Version : اين كلاينت سرور مشكلش چيه؟



one hacker alone
جمعه 04 فروردین 1391, 01:29 صبح
سلام
من يه كلاينت سرور ساده نوشتم اما برنامه كلاينت تكي اجرا ميشه ولي وقتي سرور اجرا ميشه تابع connect كلاينت خطا ميگيره برنامه كجاش اشكال داره من روي يه سيستم امتحان كردم 127.0.0.1

كلاينت

// client1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>
#include <windows.h>
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
#pragma comment(lib,"Ws2_32.lib")
#define BUFFLEN 4096


int main(int argc, char* argv[])
{
int result;
SOCKET cntsock=INVALID_SOCKET;
struct sockaddr_in sockin;
char sendbuff[512]="salam";
char recvbuff[BUFFLEN]={0};
WSADATA w_data;
if(argc<2)
{
cout<<"Usage; name <ip address> <port number>";
return 1;
}

result=WSAStartup(MAKEWORD(2,2),&w_data);
if(result!=NO_ERROR)
{
cout<<"error";
return 1;
}
cntsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(cntsock==INVALID_SOCKET)
{
cout<<"error";
WSACleanup();
return 1;
}
sockin.sin_addr.s_addr=inet_addr(argv[1]);
sockin.sin_family=AF_INET;
sockin.sin_port=htons(atoi(argv[2]));
result=connect(cntsock,(sockaddr*)&sockin,sizeof(sockin));
if(result==SOCKET_ERROR)
{
cout<<"connect error";
closesocket(cntsock);
WSACleanup();
return 1;
}
result=send(cntsock,sendbuff,(int)strlen(sendbuff) ,0);
if(result==SOCKET_ERROR)
{
cout<<"send error";
closesocket(cntsock);
WSACleanup();
return 1;
}
/*
result=shutdown(cntsock,SD_SEND);
if(result==SOCKET_ERROR)
{
cout<<"shutdown error";
closesocket(cntsock);
WSACleanup();
return 1;
}*/
do{
result=recv(cntsock,recvbuff,BUFFLEN,0);
if(result>0)
{
cout<<endl<<recvbuff;
ZeroMemory(recvbuff,BUFFLEN);
}
else if(result==0)
cout<<"Closed";
else
cout<<"recv Error";
}while(result>0);
closesocket(cntsock);
WSACleanup();
return 0;
}




سرور


// server1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream.h>
#include <windows.h>
#include <winsock.h>
#include <stdlib.h>
#include <string.h>
#pragma comment(lib,"Ws2_32.lib")
#define BUFFLEN 4096
int main(int argc, char* argv[])
{
int result,intlen;
SOCKET cntsock=INVALID_SOCKET;
struct sockaddr_in addr_clt;
char sendbuff[512]="salam";
char recvbuff[BUFFLEN]={0};
WSADATA w_data;
if(argc<2)
{
cout<<"Usage; name <ip address> <port number>";
return 1;
}
result=WSAStartup(MAKEWORD(2,2),&w_data);
if(result!=NO_ERROR)
{
cout<<"error";
return 1;
}
struct sockaddr_in addr_srv;
addr_srv.sin_addr.S_un.S_addr=INADDR_ANY;
addr_srv.sin_family=AF_INET;
addr_srv.sin_port=htons(atoi(argv[1]));
cntsock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(cntsock==INVALID_SOCKET)
{
cout<<"error";
WSACleanup();
return 1;
}
//result=bind(cntsock,&addr_srv,sizeof(addr_srv));
result=bind(cntsock,reinterpret_cast<const sockaddr*>(&addr_srv),sizeof(addr_srv));
if(result==SOCKET_ERROR)
{
cout<<"bind error";
WSACleanup();
return 1;
}
result=listen(cntsock,SOMAXCONN);
if(result==SOCKET_ERROR)
{
cout<<"error listen";
WSACleanup();
return 1;
}
intlen=sizeof(addr_clt);
result=accept(cntsock,reinterpret_cast<sockaddr*>( &addr_clt),&intlen);
//result=accept(cntsock,(sockaddr_in*)&addr_clt,&intlen);
if(result==INVALID_SOCKET)
{
cout<<"error accept";
WSACleanup();
return 1;
}
memset(recvbuff,'\0',BUFFLEN);
result=recv(cntsock,recvbuff,BUFFLEN,0);
if(result==SOCKET_ERROR)
{
cout<<"error recv";
WSACleanup();
return 1;
}
cout<<recvbuff;
closesocket(cntsock);
WSACleanup();
return 0;
}

one hacker alone
دوشنبه 21 فروردین 1391, 20:48 عصر
من براي كلاينت و سرور ميزنم 127.0.0.1 1111 و انتظار داشتم پيغام salam از طرف كلاينت به سرور بره اما در اين حين سرور خطا داد recv Error و بعدش كلاينت هم همين خطاي recv Error رو داد ميشه بگي تابع recv كجاش مشكل داره؟
با lasterror خطا رو پيگيري كردم ديدم واسه سرور MSDN ميگه


WSAENOTCONN
10057



Socket is not connected.

A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using sendto) no address was supplied. Any other type of operation might also return this error—for example, setsockopt setting SO_KEEPALIVE if the connection has been reset.

براي كلاينت هم اينو ميگه:


WSAECONNRESET
10054



Connection reset by peer.

An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.


راه حل چيه؟

amin1softco
دوشنبه 21 فروردین 1391, 22:48 عصر
من که چیزی به نظرم نرسید ولی این یک نمونه است که قبلاً تست کردم http://s1.picofile.com/file/7307594836/client_server.zip.html ببین کارت رو راه می اندازه...

one hacker alone
سه شنبه 22 فروردین 1391, 15:33 عصر
دوست عزيز ممنون كد رو خيلي دست كاري كردم آخرش اومدم يه متغير ديگه از نوع SOCKET ساختم و خروجي تابع accept رو با پارامتر هاي 0و0 توي اون ريختم و براي تابع recv هم متغير دومي كه از نوع سوكت ايجاد كردم رو فرستادم و مشكل حل شد اما علت رو نميدونم چيه شما چيزي متوجه ميشين؟


SOCKET cntsock,s2;
s2=accept(cntsock,0,0);
result=recv(s2,recvbuff,500,0);