คำตอบที่ได้รับเลือกจากเจ้าของกระทู้
ความคิดเห็นที่ 3
socket programming บน windows กับ unix/linux ไม่เหมือนกันซะทีเดียว ต้องแก้โปรแกรมบ้างครับ
- เปลี่ยน include file จาก
- เติม WSAStartup() ก่อนใช้งาน และ WSACleanup() หลังเลิกใช้
- socket ไม่ใช่ int แต่เป็น SOCKET ต้องเปลี่ยน
- socket() ไม่ได้ return error เป็น -1 แต่เป็น INVALID_SOCKET ต้องเปลี่ยน
- connect() ไม่ได้ return error เป็น -1 แต่เป็น SOCKET_ERROR ต้องเปลี่ยน
- read(), write(), close() ใช้กับ socket ไม่ได้ ต้องเปลี่ยนเป็น recv(), send() และเพิ่ม 0 เป็น parameter ตัวสุดท้าย ส่วน close() เปลี่ยนเป็น closesocket()
- เพิ่ม library ws2_32.lib เข้าไปในโปรเจคด้วย
ยังมีอื่นๆอีก ยังไงก็ลองดูที่นี่นะครับ
http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213%28v=vs.85%29.aspx
;>)
- เปลี่ยน include file จาก
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
เป็น#include <netinet/in.h>
#include <netdb.h>
#include <winsock2.h>
- เติม WSAStartup() ก่อนใช้งาน และ WSACleanup() หลังเลิกใช้
WSADATA wsaData;
int err;
err = WSAStartup(MAKEWORD(2,2),&wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return -1;
}
...
WSACleanup();
int err;
err = WSAStartup(MAKEWORD(2,2),&wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return -1;
}
...
WSACleanup();
- socket ไม่ใช่ int แต่เป็น SOCKET ต้องเปลี่ยน
int sock;
เป็นSOCKET sock;
- socket() ไม่ได้ return error เป็น -1 แต่เป็น INVALID_SOCKET ต้องเปลี่ยน
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock==-1)
{
perror("opening stream socket");
exit(1);
}
เป็นif (sock==-1)
{
perror("opening stream socket");
exit(1);
}
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock==INVALID_SOCKET)
{
perror("opening stream socket");
exit(1);
}
if (sock==INVALID_SOCKET)
{
perror("opening stream socket");
exit(1);
}
- connect() ไม่ได้ return error เป็น -1 แต่เป็น SOCKET_ERROR ต้องเปลี่ยน
if (connect(sock, (struct sockaddr *) &server, sizeof server)==-1)
{
perror("connecting stream socket");
exit(1);
}
เป็น{
perror("connecting stream socket");
exit(1);
}
if (connect(sock, (struct sockaddr *) &server, sizeof server)==SOCKET_ERROR)
{
perror("connecting stream socket");
exit(1);
}
{
perror("connecting stream socket");
exit(1);
}
- read(), write(), close() ใช้กับ socket ไม่ได้ ต้องเปลี่ยนเป็น recv(), send() และเพิ่ม 0 เป็น parameter ตัวสุดท้าย ส่วน close() เปลี่ยนเป็น closesocket()
write(sock,s,strlen(s));
write(1,s,strlen(s));
...
len = read(sock,buf,BUFSIZ);
write(1,buf,len);
...
close(sock);
เป็นwrite(1,s,strlen(s));
...
len = read(sock,buf,BUFSIZ);
write(1,buf,len);
...
close(sock);
send(sock,s,strlen(s),0);
write(1,s,strlen(s));
...
len = recv(sock,buf,BUFSIZ,0);
write(1,buf,len);
...
closesocket(sock);
write(1,s,strlen(s));
...
len = recv(sock,buf,BUFSIZ,0);
write(1,buf,len);
...
closesocket(sock);
- เพิ่ม library ws2_32.lib เข้าไปในโปรเจคด้วย
ยังมีอื่นๆอีก ยังไงก็ลองดูที่นี่นะครับ
http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213%28v=vs.85%29.aspx
;>)
แสดงความคิดเห็น
สอบถาม การเขียน C++ บนแพลตฟอร์มวินโดว์ ติดตรง #include <netdb.h> ใช้อะไรแทนดีครับ
โดยใช้ Dev C++ เขียน (หรือ Code::block เขียนก็ได้)
หัวข้อหลักคือ ต้องการให้มันส่งอีเมลล์ได้ครับ
พอดีผมไปเช็คใน stackOverflow มาครับ ปรากฏว่าcode บน base on linux ทั้งนั้นเลย
ตัวอย่างโค๊ด
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
พอเวลาเราเขียนออกมา มันจะติดตรง
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
ครับ พอไปเช็คมา ก็พบว่าต้องเขียนบนลินุคเท่านั้น (ไฟลล์ที่คอมไพล์จากลินุคก็ไม่ใช่ exe อีก)
ซึ่งผมก็ใช้ #include <winsock.h> แทนได้แค่สองตัวบน ขาด #include <netdb.h> ที่หาอะไรมาแทนไม่ได้ครับ
ผมจึงขอความช่วยเหลือตามนี้ครับ
1.มีheader อะไรที่แทน#include <netdb.h> ได้บ้างครับ
2.มีตัวอย่างอื่นที่เป็นC++ พิมพ์ข้อความในcmd แล้วสามารถส่งอีเมลล์ได้มั้ยครับ
ขอบคุณครับ