Forum: PC-Programmierung Socketprogrammierung Win32


von max .. (vbc2011)


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.

von Helfer (Gast)


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.

von max .. (vbc2011)


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;

von Helfer (Gast)


Lesenswert?

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

von DirkB (Gast)


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.

von Michael R. (dj_motionx)


Angehängte Dateien:

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

von max .. (vbc2011)


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!

von max .. (vbc2011)


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?

von Peter II (Gast)


Lesenswert?

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.

von hxd (Gast)


Lesenswert?

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.

von max .. (vbc2011)


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!

von DirkB (Gast)


Lesenswert?

Wobei es memset, memcpy, recv und send natürlich auch unter Unix gibt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Größere Probleme bekommt man allerdings, wenn man Unix-Code auf Win32 
portieren möchte und da fork auftaucht ...

von ... (Gast)


Lesenswert?

.. oder sowas wie SIGUSR etc. :)

von ... (Gast)


Lesenswert?

Btw. bcopy durch memcpy zu ersetzen kann ziemlich katastrophale Folgen 
haben!
Richtiger wäre memmove.

von ... (Gast)


Lesenswert?

andere Alternative:

bzero -> ZeroMemory
bcopy -> MoveMemory
read  -> ReadFile / WSARecv
write -> WriteFile / WSASend

von DirkB (Gast)


Lesenswert?

Mit  memset, memcpy /memmove, recv und send bleibt man aber kompatibel.

von ... (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.