PDA

View Full Version : سوال در مورد سوکت پروگرمینگ



hanita
پنج شنبه 28 آبان 1394, 10:55 صبح
سلام دوستان من یه برنامه ی کلاینت سرور ساده نوشتم که کلاینت پیام ها رو ار سال میکنه سرور اونارو میگیره و همونا رو بر میگردونه
ولی الان برنامه اجرا نمیشه و وقتی دیباگ میکنم مقدار تابع send مقدار 1- برمیگردونه میشه کمکم کنید.
تو محیط QT کار میکنم.


server code:
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<winsock2.h>
#include<fstream>
#include<sys/types.h>
#ifdef__WIN32__
#include<winsock2.h>
#else
#include<sys/socket.h>
#endif
#ifdef__WIN32__
#include<winsock2.h>
#else
#include<netinet/in.h>
#endif


intmain(){
WORDwVersionRequested;
WSADATAwsaData;
SOCKETintSocket,intRSocket;
structsockaddr_inrecServer,recClient,recSin;
intintErr,intLen;
char*charbuffer;


wVersionRequested=MAKEWORD(2,0);
if(WSAStartup(wVersionRequested,&wsaData)!=0)
{
printf("Erroroninitializing");
exit(1);
}


recServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
recServer.sin_family=AF_INET;
recServer.sin_port=htons(3666);


intSocket=socket(AF_INET,SOCK_STREAM,0);
if(intSocket==-1){
printf("\n::ErrorOnCreateSocket::%d\n",errno);
perror("socket");
exit(1);
}


intErr=bind(intSocket,(structsockaddr*)&recServer,sizeof(recServer));
if(intErr==-1){
printf("\n::ErrorOntheCallbindFunction::\n");
exit(1);
}


else{
printf("Waitingforincomingconnection");}


for(;;)
{


intErr=listen(intSocket,SOMAXCONN);
if(intSocket==-1){
printf("\n::ErrorOntheCalllistenFunction::\n");
exit(1);
}


intLen=sizeof(recClient);
intErr=accept(intSocket,(structsockaddr*)&recClient,&intLen);
if(intRSocket==-1){
printf("\n::ErrorOnConnection::\n");
exit(1);
}


intsize=sizeof(recSin);
intErr=recvfrom(intSocket,charbuffer,sizeof(charbu ffer),0,(structsockaddr*)&recSin,&size);
if(intErr==-1){
printf("\n::ErrorOnRecevData::\n");
exit(1);
}


while(intMessage=recvfrom(intSocket,charbuffer,siz eof(charbuffer),0,(structsockaddr*)&recSin,&size))
{


Message=recvfrom(intSocket,charbuffer,sizeof(charb uffer),0,(structsockaddr*)&recSin,&size);


Message=send(intRSocket,charbuffer,strlen(charbuff er),0);
}




std::ofstreamoutput_file("RecievedData.txt",std::ios::out);


if(!output_file)
{
printf("filecannotopen");
exit(1);
}


else
{
output_file<<charbuffer;
}
return0;


}


}

client code:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #ifdef __WIN32__ # include <winsock2.h> #else # include <sys/socket.h> #endif #ifdef __WIN32__ # include <winsock2.h> #else #include <netinet/in.h> #endif

int main(){ WORD wVersionRequested; WSADATA wsaData; SOCKET intSocket; struct sockaddr_in recSin; int intErr; char *charbuffer;
wVersionRequested=MAKEWORD(2,0); if(WSAStartup(wVersionRequested,&wsaData)!=0) { printf("Error on initializing"); exit(1); }
recSin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); recSin.sin_family=AF_INET; recSin.sin_port=htons(3666);
intSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if(intSocket == (unsigned)-1){ printf("\n::Error On Create Socket:: %d \n", intSocket ); perror("socket"); exit(1); }
intErr=connect(intSocket,(struct sockaddr *)&recSin,sizeof(recSin)); if(intErr==-1){ printf("\n::Error On connecting::\n");
exit(1); }
charbuffer=(char *)"HELLO\0"; intErr=send(intSocket,charbuffer,strlen(charbuffer ),0); if(intErr==-1) { printf("\n::Error On Send Data::\n"); exit(1); } memset(charbuffer,0,strlen(charbuffer));
int size=sizeof(recSin); intErr=recvfrom(intSocket,charbuffer,sizeof(charbu ffer),0,(struct sockaddr *)&recSin,&size); if(intErr==-1){ printf("\n::Error On Recev Data::\n"); exit(1); } printf("Recived Data,pchrBuffer"); closesocket(intSocket); }

negative60
پنج شنبه 28 آبان 1394, 14:10 عصر
برای قرار دادن سورس از تگ کد ++C استفاده کنيد, سورستون به دليل به هم ريختگی قابل تست نيست.

اگر پروژه شما تحت کتابخانه های پیشفرض ++c هست ميتونيد از اين مثال (http://www.taywils.me/2014/11/08/udpechoinc.html) استفاده کنيد.
اما اگر پروژتون تحت کتابخانه Qt هست ميتونيد از کلاس کار با شبکه همين کتابخانه استفاده کنيد که آسونتر هست.

کامبیز اسدزاده
پنج شنبه 28 آبان 1394, 15:06 عصر
چرا کد اینجوری کپی میشه؟؟:ناراحت:

طبق تصویر زیر عمل کنید.

136892

hanita
پنج شنبه 28 آبان 1394, 15:09 عصر
ممنون از راهنماییتون مشکل حل شد الان تابع recv خطای 34میده Result too long
میشه بگید مشکل از کجاس؟

hanita
پنج شنبه 28 آبان 1394, 15:13 عصر
طبق تصویر زیر عمل کنید.

136892
همینکارو کردم ولی بازم به هم ریخته شد

negative60
پنج شنبه 28 آبان 1394, 17:38 عصر
ممنون از راهنماییتون مشکل حل شد الان تابع recv خطای 34میده Result too long
میشه بگید مشکل از کجاس؟

اول مشخص کنيد از کدام پروتکل ميخوايد استفاده کنيد UDP يا TCP ؟
سورس کدی که قرار داديد برای پروتکل UDP هست و برای دريافت بافر در اين پروتکل از تابع recvfrom بايد استفاده کنيد, تابع recv برای دريافت بافر در پروتکل TCP هست

حامد مصافی
پنج شنبه 28 آبان 1394, 19:12 عصر
اگر از کیوت استفاده می‌کنید چرا از QTcpSocket استفاده نکردید؟؟
شاید این راه حل من (https://github.com/HamedMasafi/Noron) به درد شما بخوره. مثال RpcChat موجود در مخزن رو ببینید

hanita
شنبه 30 آبان 1394, 09:05 صبح
از پروتکل TCP استفاده کردم...
از recvfrom استفاده کردم چون همین خطا رو میداد عوض کردم به recv