hallo, ich möchte einen socket in c programmieren. habe da auch einen bsp-code - der bindet folgende header ein. #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> ausser den sys/types.h kennt mein kompiler keinen und ich bin mir nicht ganz sicher ob mein bsp für win32 oder für unix ist. in anderen foren wird auf allemöglichen .h und .lib hingewiesen - da scheint mir aber jeder einen anderen weg zu gehen. Kennst sich jemand mit socketprogrammierung unter win32 mit c aus?? Zumindest die Grundlagen - welche .lib und .h ich includen muss??!! Danke.
1) Hast du einen Link zu der Seite, von der du deinen Beispielcode hast? Vielleicht ist es damit einfacher zu entscheiden, wofür der Code ist. 2) www.codeproject.com hat Artikel zur Socketprogrammierung in C. Einfache Client/Server Sachen zur Einarbeitung.
habe leider keinen link...aber hier der erste und wichtigste teil des codes. #include <errno.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> /* sockaddr_in structure */ #include <netdb.h> /* /etc/hosts table entries */ #define TCP_PORT 25 #define MAX_ZEICHEN 4096 int smtpsend (char *hostadress,char *from,char *to,char *betreff,int zeilen,char *daten) { struct sockaddr_in myname; struct sockaddr_in *nptr; int moh; struct hostent *hp, *gethostbyaddr(); char buf[MAX_ZEICHEN]; if (( moh = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) { printf("network client socket failure \n"); return -1; } myname.sin_port = htons(TCP_PORT); /* Server port # */ myname.sin_family = AF_INET; /* Internet domain */ hp = gethostbyname (hostadress); bcopy ( hp -> h_addr_list[0], &myname.sin_addr.s_addr,hp -> h_length ); if((connect ( moh, (struct sockaddr *) &myname, sizeof(myname) ) ) < 0 ) { printf("network client connect failure \n"); close (moh); return -1; } sprintf(buf,"HELO irgendwas.at\r\n"); write (moh,buf, strlen(buf)); bzero (buf, sizeof(buf)); read(moh,buf,sizeof(buf)); sprintf(buf,"MAIL FROM: <%s>\r\n",from); write (moh,buf, strlen(buf)); bzero (buf, sizeof(buf)); read(moh,buf,sizeof(buf)); if (strncmp(buf,"250",3) != 0) return -1;
Das ist der Code von http://www.c-plusplus.de/forum/39503-10 und das ist in der Rubrik C/C++ Forum :: FAQ - Linux/Unix Die Includefiles sind für BSD-Sockets http://tangentsoft.net/wskfaq/articles/bsd-compatibility.html
Bei Windows heißen die Includes
1 | #include <winsock.h> |
2 | // evtl. auch noch
|
3 | #include <io.h> |
Und du musst mit der wsock32.lib linken Das geht z.B. mit #pragma #pragma comment( lib, "wsock32" ) /* link with wsock32.lib */ und diese auch initialisieren:
1 | /* init Winsock-DLL Version 1.1 */
|
2 | if( (errcode=WSAStartup( MAKEWORD( 1,1 ), &wsadata )) != 0 ) |
3 | { printf("%s : Fehler beim Initialisieren der WINSOCK.DLL: %s", argv[0], strerror(errcode)); |
4 | exit(-2); |
5 | }
|
Statt read und write kannst du recv und send nehmen. Ist sonst eigentlich ziemlich kompatibel. Zeilen sind aus einem Programm, das im letzten Jahrtausend von BSD-Socket auf Windows 98 portiert wurde.
Hallo ! Von mir kannst du wenn du willst einen beispielcode für einen Client unter win 32 haben. Zum Verständnis was blocking non blocking u.s.w. angeht und auch zu den Grundfunktionen kann ich http://www.zotteljedi.de/socket-tipps/ empfehlen. Wie oben schon erwähnt gat das alles mit winsock.h und socket library. Bei fragen winfach wieder melden. L.g. Michi
Das nenn ich mal einen produktiven Beitrag! Der SocketInit mit WSAStartup klappt - das und die anderen includes sind ja eig. der einzige unterschied zu dem unix-code! Die Zotteljedi-Seite ist auch sehr hilfreich! Aber da ich gelesen habe - das die Socketprogrammierung sehr mühsam sein kann - ist dieser beitrag sicherlich noch nicht abgeschlossen:) Danke soweit - das hat mir schon sehr weitergeholfen!
...da habe ich auch schon die nächste frage... das ganze soll mir ja dazu dienen eine email zu versenden... wo und wie gebe ich den Empfänger an "To" oder "Betreff" an??? da ich ja mit send() einfach nur einen buffer auf den socket schreibe! geht das überhaupt so einfach?
max .. schrieb: > as ganze soll mir ja dazu dienen eine email zu versenden... > wo und wie gebe ich den Empfänger an "To" oder "Betreff" an??? das hat wenig mit Socket programmierung zu tun, viel mir mit dem SMTP Protokoll http://www.ietf.org/rfc/rfc0821.txt und jetzt solltest du dich spätestens Frage ob es nicht sinnvoller ist eine lib dafür zu verwenden.
Vielleicht hilft dir dieses pdf: http://robsite.net/files/0000/0012/sockdoc.pdf Dort ist die Socketprogrammierung gut erklärt. Wenn das mit den Sockets mal klappt ist SMTP auch zu schaffen.
Also - die Socketprogrammierung sowie das Senden einer Mail via SMTP funktioniert. Zusammenfassung: Die wichtigsten Includes sind: #pragma comment(lib, "Ws2_32.lib") #include <winsock.h> Tipp: Man kann in der Win-Konsole auch mit telnet...manuell alle SMTP-Befehle Schritt für Schritt durchgehen und somit testen ob das Senden einer Mail mit den gewünschten Einstellungen funktioniert. Die SMTP-Befehle findet man leicht im Inet. z.B. http://www.freesoft.org/CIE/RFC/821/15.htm Weitere hilfreiche Seiten sind (wie schon erwähnt): http://www.zotteljedi.de/socket-tipps/index.html Oft findet man Beispiele für Unix - diese sind eig. kompatibel für Win bis auf 4 Funktionen: Unix -> Win bzero -> memset bcopy -> memcpy read -> recv write -> send Also - Problem gut gelöst!
Wobei es memset, memcpy, recv und send natürlich auch unter Unix gibt.
Größere Probleme bekommt man allerdings, wenn man Unix-Code auf Win32 portieren möchte und da fork auftaucht ...
Btw. bcopy durch memcpy zu ersetzen kann ziemlich katastrophale Folgen haben! Richtiger wäre memmove.
andere Alternative: bzero -> ZeroMemory bcopy -> MoveMemory read -> ReadFile / WSARecv write -> WriteFile / WSASend
Mit memset, memcpy /memmove, recv und send bleibt man aber kompatibel.
Wozu? Um das Ganze dann wieder auf Unix zurückportieren zu können? Viel sinnvoller wäre gewesen, der Entwickler der ursprünglich Software hätte schon auf sowas geachtet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.