כותב |
|
Nameless אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 20 September 2005 בשעה 22:26 | | IP רשוּם
|
|
|
|
הקוד:
קוד:
#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)
|
|
|
|
חזרה לתחילת העמוד |
|
|
Alias משתמש חבר
הצטרף / הצטרפה: 13 January 2005
משתמש: מנותק/ת הודעות: 344
|
נשלח בתאריך: 21 September 2005 בשעה 02:03 | | IP רשוּם
|
|
|
|
בקשר לשגיאה ראשונה ושנייה: הפונקציה 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
|
חזרה לתחילת העמוד |
|
|
Nameless אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 21 September 2005 בשעה 07:07 | | IP רשוּם
|
|
|
|
תודה!
|
חזרה לתחילת העמוד |
|
|
Nameless אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 21 September 2005 בשעה 15:24 | | IP רשוּם
|
|
|
|
איזה אנשים יש בעולם...מי שלמעלה (שכתב את התודה) זה לא אני.
אני שאלתי את השאלה.
בכל מקרה, תודה.
|
חזרה לתחילת העמוד |
|
|
pitbull363 משתמש חבר
הצטרף / הצטרפה: 03 June 2005
משתמש: מנותק/ת הודעות: 102
|
נשלח בתאריך: 21 September 2005 בשעה 16:40 | | IP רשוּם
|
|
|
|
Nameless כתב:
איזה אנשים יש בעולם...מי שלמעלה (שכתב את התודה) זה לא אני.
אני שאלתי את השאלה.
בכל מקרה, תודה.
|
|
|
חחחח בגלל זה צריך להירשם!
ולא לכתוב הודעות בתור "אורח"
|
חזרה לתחילת העמוד |
|
|
dnup משתמש חבר
הצטרף / הצטרפה: 27 July 2005
משתמש: מנותק/ת הודעות: 209
|
נשלח בתאריך: 21 September 2005 בשעה 17:21 | | IP רשוּם
|
|
|
|
צודק ב-100%
DnUp
|
חזרה לתחילת העמוד |
|
|
y2cRAck4 אחראי פורומים
הצטרף / הצטרפה: 28 July 2005 מדינה: Israel
משתמש: מנותק/ת הודעות: 437
|
נשלח בתאריך: 21 September 2005 בשעה 20:23 | | IP רשוּם
|
|
|
|
pitbull363 כתב:
Nameless כתב:
איזה אנשים יש בעולם...מי שלמעלה (שכתב את התודה) זה לא אני. אני שאלתי את השאלה. בכל מקרה, תודה.
|
|
|
חחחח בגלל זה צריך להירשם! ולא לכתוב הודעות בתור "אורח"
|
|
|
אני חושב שהוא מנהל פורום תכנות... לא?
__________________ ? Why to crack for
|
חזרה לתחילת העמוד |
|
|
pitbull363 משתמש חבר
הצטרף / הצטרפה: 03 June 2005
משתמש: מנותק/ת הודעות: 102
|
נשלח בתאריך: 21 September 2005 בשעה 20:27 | | IP רשוּם
|
|
|
|
חח צודק, לא שמתי לב =\
|
חזרה לתחילת העמוד |
|
|
Nameless אחראי פורומים
הצטרף / הצטרפה: 08 March 2005 מדינה: Armenia
משתמש: מנותק/ת הודעות: 69
|
נשלח בתאריך: 21 September 2005 בשעה 22:17 | | IP רשוּם
|
|
|
|
כן, אני מנהל פורום תכנות..היו לי בעיות בהתחברות שלא קשורים לאתר הזה (והמבין יבין)
בכל מקרה, no more spam plz
__________________ meow
|
חזרה לתחילת העמוד |
|
|
Nameless אורח
הצטרף / הצטרפה: 01 October 2003
משתמש: אונליין הודעות: 12647
|
נשלח בתאריך: 28 September 2005 בשעה 00:06 | | IP רשוּם
|
|
|
|
קוד:
#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
|
|
|
|
חזרה לתחילת העמוד |
|
|
|
|