לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 15-07-2008, 01:54
  WolfsCaptain WolfsCaptain אינו מחובר  
 
חבר מתאריך: 30.01.07
הודעות: 261
(C++) בעיית קימפול עם sockets

קראתי פחות או יותר את כל המדריך הענק הזה על sockets, ואני עדיין מבולבל עם כל השמות שם והדברים האלה.
בכל מקרה, העתקתי את הקוד שם של סרבר וכליינט בsockets של UDP, שיניתי קצת דברים כדי שיתקמפל (כי יש לי חלונות והוא מכוון את זה כלפי UNIX), ועכשיו זה מתקמפל עד שזה מגיע לexe ואז מפסיק, בלי שום error.
מה אמורים לעשות עם הוא לא מקמפל בלי שום בעיה ?

הנה הקודים אחרי שינוי:
Server code

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

#define MYPORT 4950 // the port users will be connecting to

#define MAXBUFLEN 100

int main(void)
{
int sockfd;
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector's address information
int addr_len;
int numbytes;
char buf[MAXBUFLEN];

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
exit(1);
}

my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof my_addr) == -1) {
exit(1);
}

addr_len = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) {
exit(1);
}

printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("packet is %d bytes long\n",numbytes);
buf[numbytes] = '\0';
printf("packet contains \"%s\"\n",buf);

closesocket(sockfd);

return 0;
}

Client code

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>

#define SERVERPORT 4950 // the port users will be connecting to

int main(int argc, char *argv[])
{
int sockfd;
struct sockaddr_in their_addr; // connector's address information
struct hostent *he;
int numbytes;

if (argc != 3) {
fprintf(stderr,"usage: talker hostname message\n");
exit(1);
}

if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
exit(1);
}

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
perror("socket");
exit(1);
}

their_addr.sin_family = AF_INET; // host byte order
their_addr.sin_port = htons(SERVERPORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);

if ((numbytes = sendto(sockfd, argv[2], strlen(argv[2]), 0,
(struct sockaddr *)&their_addr, sizeof their_addr)) == -1) {
perror("sendto");
exit(1);
}
printf("sent %d bytes to %s\n", numbytes, inet_ntoa(their_addr.sin_addr));

closesocket(sockfd);

return 0;
}

ועוד שאלה בנושא:
הכותב כתב שם הרבה פעמים להתחבר עם תל-נט שממש אין לי מושג מה זה. איך אני משתמש בזה (או באיזו שהיא דרך אחרת להתחבר) במידה ואני ארצה להשתמש ב
TCP ?

תודה רבה על כל עזרה.

ולאיזה שהוא מקרה שמישהו בהנהלה קורא את זה, אפשר בבקשה להוסיף תג בשביל קודים ?
התג של "קוד" לא מאפשר גלילה מאיזה שהיא סיבה אז הוא חותך שורות ארוכות (יאלה אני שונא את כל הבעיות האלה בין עברית לאנגלית).
אולי גם צבעים לתגובות (בכל מקום שיש שני סלשים) ודברים כאלה ?
_____________________________________



נערך לאחרונה ע"י WolfsCaptain בתאריך 15-07-2008 בשעה 02:06.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #14  
ישן 22-07-2008, 23:46
  WolfsCaptain WolfsCaptain אינו מחובר  
 
חבר מתאריך: 30.01.07
הודעות: 261
בתגובה להודעה מספר 1 שנכתבה על ידי WolfsCaptain שמתחילה ב "(C++) בעיית קימפול עם sockets"

טוב, עכשיו הכל פועל חוץ מהconnect().
הקוד שלי תקין (כבר ניסיתי כמה אפשרויות ושהן לא פעלו העתקתי אחד מהאתר של מיקרוסופט שלא פעל ואחד מאתר אחר שגם לא פעל), אני לא מבין מה הבעיה.
הסרבר פועל בסדר גמור אבל שאני פותח את הכליינט זה מקריס את שניהם. במידה והסרבר לא פתוח זה סתם קורס לבד.

יכול להיות שזה מכיוון שצריך לעשות את התל-נט ההוא ? אני מניח שזה אמור לפעול עם פשוט פותחים את שני התוכניות... אז מה הבעיה

הנה הקוד הנוכחי של הכליינט, שהעתקתי מפה, אחרי שהקודים שלי לא פעלו (כפי הנראה הם היו בסדר אחרי הכל...)

קוד PHP:
 #include <stdio.h>

#include <winsock2.h>

 

int main()

{

  
// Initialize Winsock

  
WSADATA wsaData;

  
int iResult WSAStartup(MAKEWORD(2,2), &wsaData);

  if (
iResult != NO_ERROR)

    
printf("Client: Error at WSAStartup().\n");

  else

    
printf("Client: WSAStartup() is OK.\n");

 

  
// Create a SOCKET for connecting to server

  
SOCKET ConnectSocket;

  
ConnectSocket socket(AF_INETSOCK_STREAMIPPROTO_TCP);

  if (
ConnectSocket == INVALID_SOCKET)

  {

    
printf("Client: Error at socket(): %ld.\n"WSAGetLastError());

    
WSACleanup();

    return 
0;

  }

  else

    
printf("Client: socket() is OK.\n");

 

  
// The sockaddr_in structure specifies the address family,

  // IP address, and port of the server to be connected to.

  
sockaddr_in clientService;

  
clientService.sin_family AF_INET;

  
clientService.sin_addr.s_addr inet_addr("127.0.0.1");

  
clientService.sin_port htons(55555);

 

  
// Connect to server.

  
if (connect(ConnectSocket, (SOCKADDR*)&clientServicesizeof(clientService)) != 0)

  {

    
printf("Client: Failed to connect.\n");

    
WSACleanup();

    return 
0;

  }

  else

    
printf("Client: connect() is OK.\n");

 

  
// Declare and initialize variables.

  
int bytesSent;

  
int bytesRecv SOCKET_ERROR;

  
char sendbuf[100] = "Client: Sending some data.";

  
char recvbuf[100] = "";

 

  while(
bytesRecv == SOCKET_ERROR )

  {

    
bytesRecv recv(ConnectSocketrecvbuf1000);

    if (
bytesRecv == || bytesRecv == WSAECONNRESET)

    {

      
printf("Client: Connection Closed.\n");

      break;

    }

    else

    {

       
printf("Client: recv() is OK.\n");

       
printf("Client: Bytes received: %ld\n"bytesRecv);

    }

  }

 

  
// Send and receive data.

  
bytesSent send(ConnectSocketsendbufstrlen(sendbuf), 0);

  
printf("Client: Bytes sent: %ld\n"bytesSent);

  
WSACleanup();

  return 
0;



_____________________________________



נערך לאחרונה ע"י WolfsCaptain בתאריך 22-07-2008 בשעה 23:48.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #15  
ישן 23-07-2008, 17:54
  WolfsCaptain WolfsCaptain אינו מחובר  
 
חבר מתאריך: 30.01.07
הודעות: 261
בתגובה להודעה מספר 14 שנכתבה על ידי WolfsCaptain שמתחילה ב "טוב, עכשיו הכל פועל חוץ..."

אוקי, בדקתי בcmd (פקודה שנקראת netstat) וכפי הנראה זה בכלל לא מצליח להתחבר למרות שזה טוען שזה כן. ניסיתי לשנות כל דבר, להעתיק מכל העולם ואשתו קודים שאמורים לפעול וכלום לא הולך.
חשבתי אולי זה הראוטר שלי אז מישהו יכול לבדוק את זה בשבילי בבקשה ?

זה הקוד של הסרבר
קוד PHP:
 #include  <stdio.h>

   #include  <winsock2.h>

  

   
int  main()

   {

   
WORD wVersionRequested;

   
WSADATA wsaData;

   
int  wsaerr;

  

   
// Using MAKEWORD macro, Winsock version request  2.2

   
wVersionRequested MAKEWORD(2,  2);

  

   
wsaerr WSAStartup(wVersionRequested,  &wsaData);

   if  (
wsaerr != 0)

   {

       
/* Tell the user that we could  not find a usable */

       /* WinSock DLL.*/

       
printf("The Winsock  dll not found!\n");

       return 
0;

   }

   else

   {

           
printf("The Winsock dll found!\n");

           
printf("The status: %s.\n"wsaData.szSystemStatus);

   }

  

   
/* Confirm that the WinSock DLL supports 2.2.*/

   /* Note that if the DLL supports versions greater     */

   /* than 2.2 in addition to 2.2, it will still return  */

   /* 2.2 in wVersion since that is the version we       */

   /* requested.                                         */

   
if  (LOBYTE(wsaData.wVersion) != || HIBYTE(wsaData.wVersion) != )

   {

       
/* Tell the user that we could  not find a usable */

       /* WinSock DLL.*/

       
printf("The dll  do not support the Winsock version %u.%u!\n"LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));

       
WSACleanup();

       return 
0;  

   }

   else

   {

        
printf("The  dll supports the Winsock version %u.%u!\n"LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));

        
printf("The  highest version this dll can support: %u.%u\n"LOBYTE(wsaData.wHighVersion),  HIBYTE(wsaData.wHighVersion));

   }

  

   
//////////Create a socket////////////////////////

   //Create a SOCKET object called m_socket.

   
SOCKET m_socket;

  

   
// Call the socket function and return its value  to the m_socket variable.

   // For this application, use the Internet address  family, streaming sockets, and

   // the TCP/IP protocol.

   // using AF_INET family, TCP socket type and protocol  of the AF_INET - IPv4

   
m_socket socket(AF_INETSOCK_STREAM,  IPPROTO_TCP);

  

   
// Check for errors to ensure that the socket is  a valid socket.

   
if  (m_socket == INVALID_SOCKET)

   {

       
printf("Error  at socket(): %ld\n"WSAGetLastError());

       
WSACleanup();

       return 
0;

   }

   else

   {

       
printf("socket()  is OK!\n");

   }

  

   
////////////////bind()//////////////////////////////

   // Create a sockaddr_in object and set its values.

   
sockaddr_in service;

  

   
// AF_INET is the Internet address family.

   
service.sin_family AF_INET;

   
// "127.0.0.1" is the local IP address to which the  socket will be bound.

   
service.sin_addr.s_addr inet_addr("127.0.0.1");

   
// 55555 is the port number to which the socket will  be bound.

   
service.sin_port htons(55555);

  

   
// Call the bind function, passing the created socket  and the sockaddr_in structure as parameters.

   // Check for general errors.

   
if  (bind(m_socket, (SOCKADDR*)&service,  sizeof(service)) == SOCKET_ERROR)

   {

       
printf("bind()  failed: %ld.\n"WSAGetLastError());

       
closesocket(m_socket);

       return 
0;

   }

   else

   {

       
printf("bind()  is OK!\n");

   }

  

   
// Call the listen function, passing the created  socket and the maximum number of allowed

   // connections to accept as parameters. Check for  general errors.

   
if  (listenm_socket1) == SOCKET_ERROR)

       
printf("listen():  Error listening on socket %ld.\n"WSAGetLastError());

   else

   {

       
printf("listen()  is OK, I'm waiting for connections...\n");

   }

  

   return  
0;

  } 


וזה של הכליינט
קוד PHP:
 #include <stdio.h>

#include <winsock2.h>

 

int main()

{

    
// Initialize Winsock.

    
WSADATA wsaData;

    
int iResult WSAStartup(MAKEWORD(2,2), &wsaData);

 

    if (
iResult != NO_ERROR)

         
printf("Client: Error at WSAStartup().\n");

    else

         
printf("Client: WSAStartup() is OK.\n");

 

    
// Create a socket.

    
SOCKET m_socket;

    
m_socket socket(AF_INETSOCK_STREAMIPPROTO_TCP);

 

    if (
m_socket == INVALID_SOCKET)

    {

        
printf("Client: socket() - Error at socket(): %ld\n"WSAGetLastError());

        
WSACleanup();

        return 
0;

    }

    else

       
printf("Client: socket() is OK.\n");

 

    
// Connect to a server.

    
sockaddr_in clientService;

 

    
clientService.sin_family AF_INET;

    
clientService.sin_addr.s_addr inet_addr("127.0.0.1");

    
clientService.sin_port htons(55555);

 

    if (
connect(m_socket, (SOCKADDR*)&clientServicesizeof(clientService)) == SOCKET_ERROR)

    {

        
printf("Client: connect() - Failed to connect.\n");

        
WSACleanup();

        return 
0;

    }

 

    
// Send and receive data.

    
int bytesSent;

    
int bytesRecv SOCKET_ERROR;

    
// Be careful with the array bound, provide some checking mechanism

    
char sendbuf[200] = "Client: Sending some test string to server...";

    
char recvbuf[200] = "";

 

    
bytesSent send(m_socketsendbufstrlen(sendbuf), 0);

    
printf("Client: send() - Bytes Sent: %ld\n"bytesSent);

 

    while(
bytesRecv == SOCKET_ERROR)

    {

        
bytesRecv recv(m_socketrecvbuf320);

        if (
bytesRecv == || bytesRecv == WSAECONNRESET)

        {

            
printf("Client: Connection Closed.\n");

            break;

        }

        else

            
printf("Client: recv() is OK.\n");

 

        if (
bytesRecv 0)

            return 
0;

        else

            
printf("Client: Bytes received - %ld.\n"bytesRecv);

    }

 

    return 
0;




בשביל הלינקר צריך להוסיף את
-lwsock32
ואת הספרייה של הסוקט שאין לי מושג איך היא נקראת במשהו אחר חוץ מדב, שם היא נקראת
libws2_32.a

סך הכל לקמפל את שניהם, להריץ את הסרבר ואז את הכליינט ולראות עם הם מתחברים.

תודה עם מישהו יעשה את זה
_____________________________________



נערך לאחרונה ע"י WolfsCaptain בתאריך 23-07-2008 בשעה 17:57.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 23:03

הדף נוצר ב 0.20 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר