נושאים פעיליםנושאים פעילים  הצגת רשימה של חברי הפורוםרשימת משתמשים  חיפוש בפורוםחיפוש  עזרהעזרה
  הרשמההרשמה  התחברותהתחברות RSS עדכונים
תיכנות
RSS UnderWarrior Forums : RSS תיכנות
נושא

נושא: עזרה במציאת בעיות בקוד בשפת C

שליחת תגובהשליחת נושא חדש
כותב
הודעה << נושא קודם | נושא הבא >>
Nameless
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 20 September 2005 בשעה 22:26 | IP רשוּם
ציטוט Nameless

הקוד:

קוד:

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")

int start_sock()
{
WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 0);
WSAStartup(wVersionRequested, &wsaData);
if (WSAStartup(wVersionRequested, &wsaData) < 0)
{
printf("\nWrong Version");
 return(1);
}
else
 return (0);
}

int main()
{
int PORT,SERVER;
char NICKNAME[29];
char MESSAGE[51];
int sockfd, bytes_recv, bytes_sent;
struct sockaddr_in sock_info;
struct hostent *target;
char recv_buffer[20];
FILE *fp;

start_sock();

printf("PORT: ");
scanf("%d \n", &PORT);
printf("SERVER: ");
scanf("%d \n", &SERVER);
printf("NICKNAME: ");
scanf("%c \n", &NICKNAME);

fp = fopen("C:\txt.txt", "wt");
if (fp == NULL)
{
printf("Error opening file\n");
return(1);
}

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
 fprintf(fp, "Error occured while requesting socket file descriptor\n");
 return(1);
}

target = gethostbyname(SERVER);
if (target == NULL)
{
fprintf(fp, "Error while trying to convert host name to IP address\n");
return(1);
}

sock_info.sin_family = AF_INET;
sock_info.sin_port = htons(PORT);
sock_info.sin_addr = inet_addr(target);
if (sock_info.sin_addr == -1)
{
fprintf(fp, "Error while converting IP with numbers and dots to unsigned long\n");
return(1);

memset(&(sock_info.sin_zero), '\0' , 8);

connect(sockfd, (struct sockaddr *)&sock_info, sizeof(struct sockaddr));
if (sockfd == -1)
{
fprintf(fp, "Error while trying to connect to server\n");
return(1);
}

bytes_recv = recv(sockfd, recv_buffer, 20, 0);
if (bytes_recv == 0)
{
fprintf(fp, "Error occured - the server closed the connection\n");
return(1);
}
else if (bytes_recv == -1)
{
fprintf(fp, "Error while trying to recieve from the server\n");
return(1);
}
/*else if (bytes_recv == "Ping?")
{
bytes_sent = send(sockfd, "Pong!", 6, 0);
}*/
fprintf(fp, recv_buffer);
fclose(fp);
closesocket(sockfd);
WSACleanup();
return(0);
}


התוצאות של הקימפול (visual C++ 6 pro)

קוד:


irc.c(55) : warning C4047: 'function' : 'const char *' differs in levels of indirection from 'int '
irc.c(55) : warning C4024: 'gethostbyname' : different types for formal and actual parameter 1
irc.c(64) : warning C4133: 'function' : incompatible types - from 'struct hostent *' to 'const char *'
irc.c(64) : error C2115: '=' : incompatible types
irc.c(65) : error C2088: '==' : illegal for struct


irc.obj - 2 error(s), 3 warning(s)


חזרה לתחילת העמוד הצג את כרטיס החבר של Nameless חפש הודעות אחרות של Nameless בקר בדף הבית של Nameless
 
Alias
משתמש חבר
משתמש חבר
סמל אישי

הצטרף / הצטרפה: 13 January 2005
משתמש: מנותק/ת
הודעות: 344
נשלח בתאריך: 21 September 2005 בשעה 02:03 | IP רשוּם
ציטוט Alias

בקשר לשגיאה ראשונה ושנייה: הפונקציה gethostbyname מוגדרת כך:
קוד:
struct hostent* FAR gethostbyname(const char* name);

כלומר הפרמטר שהיא מקבלת הוא מצביע מסוג צ'אר. אצלך משום מה SERVER הוא מסוג int... לפי מה שראיתי SERVER אמור לשמור אצלך את שם השרת (למשל blabla.co.il) וכמו שאתה רואה זה מחרוזת ולא מספר.
תגדיר אותו למשל
קוד:
char SERVER[]="irc.nix.co.il";



בקשר לשגיאה השלישית: הפונקציה inet_addr מוגדרת כך:
קוד:
unsigned long inet_addr(const char* cp);

כמו שאתה רואה הפרמטר שהפונקציה מקבלת הוא מצביע מסוג צ'אר.
אצלך בקוד target הוא מסוג struct hostent * .
כאשר אתה עושה gethostbyname הכתובת כבר נשמרת בצורה מסודרת בתוך אחד השדות של target. לכן כל מה שאתה צריך לעשות זה להגיד ל-sock_info.sin_addr להצביע לאותו תא ממנו מתחילה הכתובת ב- target (במקום להשתמש ב- inet_addr, בה אתה משתמש כאשר הנתון הוא כתובת האייפי בצורה לא מסודרת).
והבדיקה אחרי sock_info.sin_addr = מיותרת מפני שאתה אמור לצאת מנקודת הנחה שאם הגעת עד לשם הכתובת שרצית תועתק ל-sock_info.sin_addr אחרת לא היית אמור להגיע לשם בכלל... (הבעיות הבאות קשורות לכך שניסית להשוות שם מבנה לשלם כשתסיר את הבדיקה יוסרו איתה גם הבעיות).

כמה טיפים שלא קשורים כ"כ לסוקטים אלא יותר לשפה:
-כשאתה משתמש ב- scanf אתה לא צריך לרשום \n וגם הרווח שהוספת שם טיפה בעייתי כי המשתמש יצטרך לרשום מספר+רווח כדי שמה שהוא יזין יוזן כמו שצריך.
-כשאתה רוצה לפתוח קובץ שלא נמצא באותה סיפרייה של הקובץ הפעלה כשאתה משתמש בתו '\' תכפיל אותו כיוון שזה תו שמור לדוגמא: C:\\txt.txt.
-כשאתה רוצה לפתוח קובץ ואתה רוצה שיפתח ואם הוא לא קיים אז הוא יווצר במקום "wt" תרשום "a+".
-כשאתה קולט שם זה מחרוזת. %c זה לקליטת תו בודד, עליך להשתמש ב- "%s"
למשל: scanf("%s \n", NICKNAME);

כדי ללמוד עוד על המבנים וההגדרות של הפונקציות תסתכל ב- MSDN
חזרה לתחילת העמוד הצג את כרטיס החבר של Alias חפש הודעות אחרות של Alias בקר בדף הבית של Alias
 
Nameless
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 21 September 2005 בשעה 07:07 | IP רשוּם
ציטוט Nameless

תודה!
חזרה לתחילת העמוד הצג את כרטיס החבר של Nameless חפש הודעות אחרות של Nameless בקר בדף הבית של Nameless
 
Nameless
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 21 September 2005 בשעה 15:24 | IP רשוּם
ציטוט Nameless

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

חזרה לתחילת העמוד הצג את כרטיס החבר של Nameless חפש הודעות אחרות של Nameless בקר בדף הבית של Nameless
 
pitbull363
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 03 June 2005
משתמש: מנותק/ת
הודעות: 102
נשלח בתאריך: 21 September 2005 בשעה 16:40 | IP רשוּם
ציטוט pitbull363

Nameless כתב:
איזה אנשים יש בעולם...מי שלמעלה (שכתב את התודה) זה לא אני.
אני שאלתי את השאלה.
בכל מקרה, תודה.


חחחח בגלל זה צריך להירשם!
ולא לכתוב הודעות בתור "אורח"
חזרה לתחילת העמוד הצג את כרטיס החבר של pitbull363 חפש הודעות אחרות של pitbull363
 
dnup
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 27 July 2005
משתמש: מנותק/ת
הודעות: 209
נשלח בתאריך: 21 September 2005 בשעה 17:21 | IP רשוּם
ציטוט dnup

צודק ב-100%    

DnUp

חזרה לתחילת העמוד הצג את כרטיס החבר של dnup חפש הודעות אחרות של dnup
 
y2cRAck4
אחראי פורומים
אחראי פורומים
סמל אישי

הצטרף / הצטרפה: 28 July 2005
מדינה: Israel
משתמש: מנותק/ת
הודעות: 437
נשלח בתאריך: 21 September 2005 בשעה 20:23 | IP רשוּם
ציטוט y2cRAck4

pitbull363 כתב:
Nameless כתב:
איזה אנשים יש בעולם...מי שלמעלה (שכתב את התודה) זה לא אני.
אני שאלתי את השאלה.
בכל מקרה, תודה.


חחחח בגלל זה צריך להירשם!
ולא לכתוב הודעות בתור "אורח"

dnup כתב:

צודק ב-100%    

DnUp

אני חושב שהוא מנהל פורום תכנות... לא?



__________________
? Why to crack for
חזרה לתחילת העמוד הצג את כרטיס החבר של y2cRAck4 חפש הודעות אחרות של y2cRAck4 בקר בדף הבית של y2cRAck4
 
pitbull363
משתמש חבר
משתמש חבר


הצטרף / הצטרפה: 03 June 2005
משתמש: מנותק/ת
הודעות: 102
נשלח בתאריך: 21 September 2005 בשעה 20:27 | IP רשוּם
ציטוט pitbull363

חח צודק, לא שמתי לב =\
חזרה לתחילת העמוד הצג את כרטיס החבר של pitbull363 חפש הודעות אחרות של pitbull363
 
Nameless
אחראי פורומים
אחראי פורומים


הצטרף / הצטרפה: 08 March 2005
מדינה: Armenia
משתמש: מנותק/ת
הודעות: 69
נשלח בתאריך: 21 September 2005 בשעה 22:17 | IP רשוּם
ציטוט Nameless

כן, אני מנהל פורום תכנות..היו לי בעיות בהתחברות שלא קשורים לאתר הזה (והמבין יבין)
בכל מקרה, no more spam plz



__________________
meow
חזרה לתחילת העמוד הצג את כרטיס החבר של Nameless חפש הודעות אחרות של Nameless
 
Nameless
אורח
אורח


הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין
הודעות: 12647
נשלח בתאריך: 28 September 2005 בשעה 00:06 | IP רשוּם
ציטוט Nameless

קוד:

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")

int start_sock()
{
WSADATA wsaData;
WORD wVersionRequested;
wVersionRequested = MAKEWORD(2, 0);
WSAStartup(wVersionRequested, &wsaData);
if (WSAStartup(wVersionRequested, &wsaData) < 0)
{
printf("\nWrong Version");
 return(1);
}
else
 return (0);
}

int main()
{
int PORT;
char NICKNAME[29];
char MESSAGE[51];
char SERVER[10];
int sockfd, bytes_recv, bytes_sent;
struct sockaddr_in sock_info;
struct hostent *target;
char recv_buffer[20];
FILE *fp;

start_sock();

printf("PORT: ");
scanf("%d \n", &PORT);
printf("SERVER: ");
scanf("%d \n", &SERVER);
printf("NICKNAME: ");
scanf("%c \n", &NICKNAME);

fp = fopen("C:\txt.txt", "wt");
if (fp == NULL)
{
printf("Error opening file\n");
return(1);
}

sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
 fprintf(fp, "Error occured while requesting socket file descriptor\n");
 return(1);
}

target = gethostbyname(SERVER);
if (target == NULL)
{
fprintf(fp, "Error while trying to convert host name to IP address\n");
return(1);
}

sock_info.sin_family = AF_INET;
sock_info.sin_port = htons(PORT);
sock_info.sin_addr = inet_addr(target);
/*if (sock_info.sin_addr == -1)
{
fprintf(fp, "Error while converting IP with numbers and dots to unsigned long\n");
return(1);
} */
memset(&(sock_info.sin_zero), '\0' , 8);

connect(sockfd, (struct sockaddr *)&sock_info, sizeof(struct sockaddr));
if (sockfd == -1)
{
fprintf(fp, "Error while trying to connect to server\n");
return(1);
}

bytes_recv = recv(sockfd, recv_buffer, 20, 0);
if (bytes_recv == 0)
{
fprintf(fp, "Error occured - the server closed the connection\n");
return(1);
}
else if (bytes_recv == -1)
{
fprintf(fp, "Error while trying to recieve from the server\n");
return(1);
}
/*else if (bytes_recv == "Ping?")
{
bytes_sent = send(sockfd, "Pong!", 6, 0);
}*/
fprintf(fp, recv_buffer);
fclose(fp);
closesocket(sockfd);
WSACleanup();
return(0);
}


תיקנתי אותו אבל לא הבנתי לגבי ה inet_addr מה צריך להחליף בדיוק...

קוד:

warning C4133: 'function' : incompatible types - from 'struct hostent *' to 'const char *'
error C2115: '=' : incompatible types


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

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

  שליחת תגובהשליחת נושא חדש
גרסת הדפסה גרסת הדפסה

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