problema sa sockets C code

N

neocool

Guest
Hello,
Ako ay nagsisikap upang lumikha ng isang server at isang client gamit c.Paggamit ng Dev C 4.9.8.0 compiler, hindi ako sumulat ng libro ang aking code.
Una sa lahat, ang mga halimbawa ko na natagpuan sa internet gamitin socket.h, habang ang bersyon na ito ng compier ay hindi ito, lamang winsock.h
Kaya, ako ay nabago ang # isama <winsock.h> sa aking mga file.

Kapag ako ay sumulat ng libro, ito ay nagbibigay sa akin ang mga error redefinition tulad ng "struct in_addr", INADDR_ANY, IN_CLASS_HOST, IN_CLASSA at iba pa ..Hindi ko alam kung saan ito kumuha's doubles mula sa ..

Ang anumang tulong ay appreciated.
Salamat

Ito ang aking code:
--------------------------

# isama <string.h>
# isama <sys/types.h>
/ / # isama <sys/socket.h>
# isama <winsock.h>
# isama <netinet/in.h>

# define MYPORT 1,026 / / koneksyon port para sa ComBlock

# define BACKLOG 2 / / kung gaano karaming mga nakabinbin na mga koneksyon sa pila ay matagalan

pangunahing ()
(
int sockfd, new_fd; / / makinig sa sock_fd, ang mga bagong koneksyon sa new_fd
struct sockaddr_in my_addr; / / ang aking address na impormasyon
struct sockaddr_in their_addr; / / address connector ang impormasyon ng
int sin_size;
int lenof_buf = 8,192; / / max packet size = 8K
int bytes_received;
magpawalang-bisa char * buf = [];sockfd = socket (AF_INET, SOCK_STREAM, 0);
/ / Error checking tinanggal na

my_addr.sin_family = AF_INET; / / host byte order
my_addr.sin_port = htons (MYPORT); / / maikling, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; / / auto-punuin ng aking mga IP
memset (& (my_addr.sin_zero), '\ 0',

<img src="http://www.edaboard.com/images/smiles/icon_cool.gif" alt="Malamig" border="0" />

; / / Zero ang magpahinga ng ang struct

/ / Error checking tinanggal na
sin_size = sizeof (struct sockaddr_in);
magbigkis (sockfd, (struct sockaddr *) & my_addr, & sin_size);

makinig (sockfd, BACKLOG);

new_fd = tanggapin (sockfd, (struct sockaddr *) & their_addr, & sin_size);

bytes_received = recv (new_fd, & buf, lenof_buf, 0);

printf ( "% c", buf);

)---------------------------------------

 
Bakit hindi titingnan mo ang mga halimbawa WinSock (makukuha sa http://tangentsoft.net/wskfaq/)

Alam ko ang winsock ay isang 'kakaiba' na header na file.Kailangan ninyong isama ang Winsock.h file bago ang file Windows.h (kapag ginagamit mo ito masyadong, marahil sa iba pang mga file na header).
Maaaring mangyari ang winsock.h file na naglalarawan sa mga istruktura na kung saan ay binibigyang-kahulugan din sa socket.h file o ng isa sa iba pang mga kasama.
Ako hulaan ang dapat mo lamang isama ang winsock.h o winsock2.h file.
At i-check ang mga halimbawa!

Code:

# ifdef WINDOWS_SOCKETS

# isama <winsock2.h>

# sino pa ang paririto

# isama <sys/time.h>

# isama <sys/types.h>

# isama <sys/socket.h>

# isama <unistd.h>

# endif
 
Antharax wrote:

Bakit hindi titingnan mo ang mga halimbawa WinSock (makukuha sa http://tangentsoft.net/wskfaq/)Alam ko ang winsock ay isang 'kakaiba' na header na file.
Kailangan ninyong isama ang Winsock.h file bago ang file Windows.h (kapag ginagamit mo ito masyadong, marahil sa iba pang mga file na header).

Maaaring mangyari ang winsock.h file na naglalarawan sa mga istruktura na kung saan ay binibigyang-kahulugan din sa socket.h file o ng isa sa iba pang mga kasama.

Ako hulaan ang dapat mo lamang isama ang winsock.h o winsock2.h file.

At i-check ang mga halimbawa!Code:

# ifdef WINDOWS_SOCKETS

# isama <winsock2.h>

# sino pa ang paririto

# isama <sys/time.h>

# isama <sys/types.h>

# isama <sys/socket.h>

# isama <unistd.h>

# endif
 
Ako ay makapagdagdag ang silid-aklatan sa mga proyekto.

ngayon ang naipon server exe file ay dapat na tanggapin port bilang isang argument na at magpakita ng ilang teksto na ang server ay tumatakbo, ngunit sa halip ay ito lamang ang nagpapatakbo ng
walang kahit na humihingi sa akin na magpasok ng anumang mga "ports" na at hindi na output kahit ano.

anumang mga ideya kung bakit?

 
dahil sa ang mga lamang code ang iyong post ay may
pangunahing () bilang pangunahing function na ako hulaan na hindi mo tukuyin ang mga argumento?

Code:

# isama <stdio.h>

# isama <stdlib.h>int pangunahing (int argc, char * argv [])

(

/ / May argc ang bilang ng mga sangkap (C-string) sa argv

habang (argc -)

printf ( "% s \ n", * argv );

exit (EXIT_SUCCESS);

)
 
Ako lutasin ang problema.Ito ay naka-out na ang reinstallation ng Dev compiler ay nakatulong.Marahil ako messed up sa mga aklatan ng ako ay gamit ang ilan na ko na nakita sa internet.

Ngayon, mayroon akong ibang katanungan sa parehong paksa.
Gusto ko ang aking client na basahin ang anumang mga file at ipadala ito sa server sa pamamagitan ng sockets.Ako ay gumawa ng isang buffer para sa pagbasa ng datos mula sa ilang mga file at tukuyin ang mga ito bilang "char szBuf [10000]"; Naiintindihan ko na ito ay hindi sapat para sa anumang sukat ng file.
Ako may tried gamit ang "char * szBuf", subalit matapos ang pagpapatupad, ang socket nagbalik mga error at hindi magpadala ng kahit ano.
Gayundin, ang paggamit sa unang lumapit sa unang kaso nagpapadala ng isang pares (kakaunting) hindi kilalang karakter.

kung paano mo pumunta sa paligid ng problemang ito?Ako attaching isang piraso ng code na file ng form client.cpp:
Code:/ /

/ / Magpadala ng data sa server

/ /

char myfile [] = "datafile.dat";

char szBuf [10000]; //<----------------

/ / char * buffer; //<------ ay hindi gumagana

FILE * sourceFile;

kung ((sourceFile = fopen (myfile, "r")) == null) (

printf ( "Error sa pagbukas ng file \ n");

bumalik;

)

/ / memset (szBuf, 0, sizeof (szBuf));nRet = fread (szBuf, 1, 10000, sourceFile);

/ / nRet = fread (buffer, 1, ang 1000, sourceFile);/ / printf ( "Bytes basahin mula sa file na szBuf:% d \ n", nRet);

fclose (sourceFile);/ / Magpadala ng szBuf sa socket

nRet = magpadala (theSocket, szBuf, strlen (szBuf), 0);closesocket (theSocket);

bumalik;

 
/ / char * buffer; //<------ ay hindi gumagana

Ikaw ay may karapatan!Na ito ay hindi gumagana.Ikaw lamang tukuyin ang isang vanturo sa isang lokasyon sa memorya.Ito ay hindi initialize kaya puntos sa wala.
Una kailangan mong maglaan ng memorya bago ka makakapag-gamitin ito

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />

.

Code:

buffer = malloc (NR_OF_ITEMS * sizeof (char))
 
Salamat Anthrax,
Ako ay nagsisikap na ipatupad ito sa ngayon.

kung ano ang parameter ko gagamitin upang buksan ang isang JPG file para sa pagbabasa at pagsusulat?
ay ito
sourceFile = fopen (myfile, "RB") <-------- RB para basahin ang binary
destinationFile = fopen (saveFile, "AB") <------ AB para sa mga ikakabit binary?

 
Everything nagtrabaho.Ako ay able sa magpadala ng anumang uri ng file na ngayon!Big thanks!!

Mayroon akong ibang tanong na kasama ang daan-daan sa ibang mga iyan ..ngunit ang isa sa isang panahon upang hindi matabunan kahit sino dito.
Ang client karapatan code sa ngayon ay gumagamit ng hostname upang kumonekta sa server.Gusto kong gamitin ang mga IP sa halip.

Ako natagpuan ng ilang impormasyon tungkol sa mga nagko-convert mula sa hukbo sa network ng order, subalit sa pagkakaroon ng ilang mga pagkakamali compilation.
Ito ang aking kasalukuyang pagpapatupad:
Code:# isama <stdio.h>

# isama <winsock2.h>

pangunahing () kahulugan

(

.

.

.

)magpawalang-bisa StreamClient (char * szServer, maikling nPort)

(.

.

.SOCKADDR_IN saServer;saServer.sin_family = AF_INET;

saServer.sin_port = htons (nPort); / / Port numero mula sa command line

saServer.sin_addr * * * = ((LPIN_ADDR) * lpHostEntry-> h_addr_list);

.

.

.)

 
Siguro ay dapat na ninyong simulan ang pagbabasa tungkol sa sockets ng kaunti pang

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />Msdn ay isang paglalarawan ukol sa allot ng tungkulin ng winsock.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/gethostbyname_2.asp

At ako would magmungkahi na bumili ka ng isang magandang C o C libro too!Kung kayo ay sumusulat ito sa PC, C ay isang magandang at malakas na wika.Subalit ito rin ay isang mapanganib na wika.Kapag hindi mo alam ang eksaktong kung ano ang iyong ginagawa, maaari kang lumikha ng kakaibang mga application

<img src="http://www.edaboard.com/images/smiles/icon_wink.gif" alt="Wink" border="0" />

.tungkol sa iyong problema, ito ay inilarawan sa msdn
Quote:

Ang gethostbyname function ay hindi maaaring malutas ang mga string ng mga IP address na dumaan dito.
Ang ganitong mga kahilingan ay ginagamot mismo ng tulad sa kung ang isang hindi kilalang pangalan ng host ay lumipas.
Gamitin inet_addr sa convert ng isang string ng IP address ang string sa isang aktwal na mga IP address, at pagkatapos ay gumamit ng ibang function, gethostbyaddr, upang makuha ang mga nilalaman ng hostent istraktura.
 
Salamat sa iyo para sa mga kapaki-pakinabang na impormasyon at mga link.Ako ay nasa proseso ng pag-aaral, sa katunayan.

Ako ay may isang katanungan tungkol sa bisa ng aking mga paraan ng packetizing data.
Ang application na ako sa pag-unlad ay para sa board, na may isang maliit na nagpapahina ng lakas ay dapat flushed upang makatanggap ng data ng kumpleto.Kaya, upang magpadala ng mga file sa pamamagitan nito, ako na unang mapula ang nagpapahina ng lakas, at pagkatapos ipadala ang data at mapera ito muli.
Sa pagtanggap ng side, ako upang ipagwalang-bahala ang Flushing impormasyon.
Ako ay nagsisikap na gamitin ang \ 0 null character bilang Flushing packet.Aking mga client lamang ang mga tindahan sa lahat ng bagay na napupunta inbetween.

Gusto theoretically ito gumagana?Ako ay nababahala na may maaaring ang ilang mga intermediate null ng data na ipinadala sa pagitan ng packet na maaaring gumawa ng server ko ipagwalang-bahala ang natitirang bahagi ng data.

Maraming salamat sa mga payo sa isulong

 
Socket Programming sa MFC (2). PdfBABALA: ANG WIKA ON THIS BOARD AY INGLES!Huwag mag-upload ng mga file IBANG WIKA maliban kung ang partikular na hiniling at malinaw na mentionned!
 
Quote:

Gusto theoretically ito gumagana?
Ako ay nababahala na may maaaring ang ilang mga intermediate null ng data na ipinadala sa pagitan ng packet na maaaring gumawa ng server ko ipagwalang-bahala ang natitirang bahagi ng data.
 
Salamat Anthrax,

Ako ay nagpasya na ko bang gamitin ang isa sa char bandila upang makilala una, gitna at huling packet.Kapag sinusubukan upang magpadala ng isang text file na, dalhin ko 511 bytes ng data at 1 byte para sa bandila, ilagay ito sa array at magpadala ng mga ito.
Gayunman, para sa ilang kadahilanan, ang teksto ay kadalasa'y medyo makalat: ang ilan sa mga format ay nawala at marahil ay may kulang na data.
Kung ako sa pagpi-print ng bawat packet sa dos, tila ang aking client nagdadagdag ng isa pang simbolo sa dulo ..naghahanap ng isang bagay tulad ng rombus (anumang espesyal na simbolo?).Kapag gumawa ako ng isang strlen (Packet), ito ay nagpapakita ng 513 bytes.

Lamang ako gamit ang aking sariling computer upang subukan ang mga server at ang client ng sabay-sabay, kaya ako sa pagkonekta sa aking sarili.Na ako walang ideya kung bakit ang mga teksto ay nakakakuha ng messed up gusto na.Bago ko na ang nagpasimula ng mga flag na ang mensahe, ito ay pagdating pagmultahin.

narito kung paano ako gumawa ng isang packet data mula sa at ang isang flag:
Code:char * ConstructPacket (char * Packet, char * Buf, int szBuf, char * bandila)

(

char * newPacket;

newPacket = (char *) calloc (szBuf sizeof (char), sizeof (char));

strcat (newPacket, bandila);

strcat (newPacket, Buf);libre (Packet);bumalik (newPacket);

)

 
Ang problema ay lutasin.Ako ay gumagamit ng strcat () function sa cancatenate binary data na nakapaloob nulls.Ko na nabago ito sa memcpy ().

Hindi ko pa nabanggit na ito bago dahil sa ilang mga problema sa aparato ako ay trying sa makipag-usap sa

Salamat

Salamat

 
para sa socket programming subukan ang isang ito
Paumanhin, ngunit kailangan mong mag-login in upang makita ang attachment na ito

 

Welcome to EDABoard.com

Sponsor

Back
Top