Socketprogrammierung Win32

#2122228
Lesenswert?

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.
Gast #2122230
Lesenswert?

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.
#2122248
Lesenswert?

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;
Gast #2122351
Lesenswert?

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.
#2122386
Lesenswert?

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
Angehängte Dateien:
#2122398
Lesenswert?

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!
#2122465
Lesenswert?

...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?
#2124796
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren