[C++] SIGSEGV przy bindowaniu portu UDP.. czemu?

0

Uzywam Dev-C++ oraz kompilatora BC5.5 i jednoczesnie przy binodwaniu portu GDB pokazuje mi SIGSEGV czyli blad segmentacji ale czemu??

void bzero(char *t, unsigned int max) {
	for (register unsigned int i = 0; i < max; i++
		*(t + i) = '\0';
}
//--------------------------
int main(void){
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(2, 0);              // Request WinSock v2.0
	if (WSAStartup(wVersionRequested, &wsaData) != 0) {  // Load WinSock DLL
		perror("WSAStartUp");
		exit(1);
	}
	// create the descriptor to socket
	int socket_descriptor;
	//create the variables to store the address of local machine and server
	struct sockaddr_in local_addr, server_addr;
	//create the buffer
	char msg[BUFFER_SIZE];
	//
	printf("Client>creating the socket(AF_INET 'IP', STREAM, UDP)...");
	//create the socket
	socket_descriptor = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	// check if this socket was well created
	if ( socket_descriptor < 0 )
	{
		printf("[aborted]\n");
		perror("[error - failure in the socket creation]\n");
		exit(1);
	}
	printf("[OK]\n");
	//initialize the address and port for client
	bzero( (char *) &local_addr, sizeof(local_addr));
	local_addr.sin_family = AF_INET;
	local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	local_addr.sin_port = htons(CLIENT_PORT);
	//
	printf("Client>binding the socket...");
	//make and check the bind between the socket 
	// and the local address and local port
	if( bind(socket_descriptor, (struct sockaddr *) &local_addr, sizeof(local_addr) ) ) {
		printf("[aborted]\n");
		perror("[error - failure in the socket binding]\n");
		exit(1);
	}
	printf("[OK]\n");
.....

i GDB mi pokazuje ze na BIND jest SIGSEGV..
;( pomozcie prosze

0
bartosak napisał(a)
    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    local_addr.sin_port = htons(CLIENT_PORT);

powinno byc:

    local_addr.sin_family = AF_INET;
    local_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    local_addr.sin_port = htons(CLIENT_PORT);

tylko jeszczen ie wiem jakie to moze miec skutki

0
local_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 

bo to jest bind na tzn loopback.. ;-)

jest wszystko wporzo a jak zbinodwac na ADDR_ANY ?
no MSDN napisal:

If an application does not care what local address is assigned, specify the manifest constant value ADDR_ANY for the sa_data member of the name parameter. This allows the underlying service provider to use any appropriate network address, potentially simplifying application programming in the presence of multihomed hosts (that is, hosts that have more than one network interface and address).

to mam po prsotu napisac ze sie wona ADDR_ANY?

a znienna INADDR_ANY to jest to samo tylko z odwrotna notacja ??

Jakiej wartosci bym nie uzyl to mam segmentation fault (sygnal SIGSEGV) tzn GDB tak mowi ale jak biore continue to program dziala..

0

Ale o co ci chodzi?
ADDR_ANY = INADDR_ANY = "0.0.0.0" = 0
jak ci TO może nie działać?

Jak ci gdb pokazuje, że "przy bindowaniu" jest błąd?
Czy bind() zwraca błąd (SOCKET_ERROR)??
Jakoś dziwnie programujesz w WinSocku... Używaj SOCKET_ERROR, INVALID_SOCKET jak należy.
U mnie TEN kod w takiej postaci z INADDR_ANY działa bez błędów...

0
marcinEc napisał(a)

Ale o co ci chodzi?
ADDR_ANY = INADDR_ANY = "0.0.0.0" = 0
jak ci TO może nie działać?

Jak ci gdb pokazuje, że "przy bindowaniu" jest błąd?
Czy bind() zwraca błąd (SOCKET_ERROR)??
Jakoś dziwnie programujesz w WinSocku... Używaj SOCKET_ERROR, INVALID_SOCKET jak należy.
U mnie TEN kod w takiej postaci z INADDR_ANY działa bez błędów...

 	bzero( ( char *) &local_addr, sizeof(local_addr));
	local_addr.sin_family = AF_INET;
   	local_addr.sin_addr.s_addr = INADDR_ANY; 
        local_addr.sin_port = htons(CLIENT_PORT);

programik dziala wystarczy wyslac komende : \status</b>

ale przy debugowaniu GDB daje SIGSEGV i nie wiem czemu ... nawet jak nie binduje portu i tylko sendto uzywam to programik pokazuje mi odpowiedz a GDB pokazuje SIGSEGV

MarcinEC szczerze licze na Twoja pomoc..

0
bartosak napisał(a)

(...)
ale przy debugowaniu GDB daje SIGSEGV i nie wiem czemu ... nawet jak nie binduje portu i tylko sendto uzywam to programik pokazuje mi odpowiedz a GDB pokazuje SIGSEGV

Odpowiedź chyba jest prosta: masz błąd w programie ;-P
To nie ma sensu panikować, że bind() nie działa... Sprawdzasz wszystkie błędy, ILOŚĆ odebranych danych, alokujesz odpowiednią ILOŚĆ miejsca w buforach, masz dobrze indeksy tablic/buforów??

bartosak napisał(a)

MarcinEC szczerze licze na Twoja pomoc..

[green] marcinEc/marcinec

0

[wstyd] przepraszam MarcinEc [wstyd]

moze wklje Ci kod programiku (kompiluje pod Dev C++ lub BCC55 i tak ten sam blad)

KOD ŹRÓDŁOWY

kod jest niewiele wiekszy niz ten ktory wkleilem ale nie chce zasmiecac forum

Wiec mozesz sprawdzic programik wysylajac komende \status</b>

Ponad to GDB dokladnie przy bindowaniu robi SIGSEGV (ale program dziala dalej) tylko jak ustawie "127.0.0.0" a nie "0.0.0.0" to nie ma SIGSEGV

wrr i nie wiem o co chodzi :/

0

Ehm, na dzień dobry (MinGW):
UDP.cpp1: warning: "WIN32" redefined
<built-in>1: warning: this is the location of the previous definition
UDP.cpp error: extra `;'

Problem w tym, że u mnie to bez problemów działa...

E:\Marcin\temp\2005-07-30\UDP>g++ -W -Wall -pedantic UDP.cpp -lwsock32

E:\Marcin\temp\2005-07-30\UDP>a
Client>starting Client with  port:1441 and sending messages to 213.228.239.224:1717
Client>creating the socket(AF_INET 'IP', STREAM, UDP)...[OK]
Client>binding the socket...[OK]
Cliente>type a new message:\status\
Cliente>9 bytes was sent to 213.228.239.224:1717
Server>\hostname\[CFC] Chicken's Farm - Polish Honor (PL)\gamename\armygame\game
ver\2.4.0\hostport\1716\mapname\Bridge Crossing\gametype\AAGP_GameTeamObjective\
numplayers\0\numteams\2\maxplayers\20\gamemode\openplaying\password\0\tour\2\off
icial\1\leased\1\nato\0\miles\0\cheats\0\minhonor\9\maxhonor\100\groups\ALL\curr
ent_round\0/7\mission_time\5:18\sv_punkbuster\1\tournament\0\ultimate_arena\0\th
irdparty\0\custom\0\AdminName\\AdminEMail\\score_t0\0\score_t1\0\final\\queryid\1.1?
Cliente>type a new message:Cliente>478 bytes was sent to 213.228.239.224:1717
^C
E:\Marcin\temp\2005-07-30\UDP>gdb a.exe
GNU gdb 5.2.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...(no debugging symbols found)...
(gdb) r
Starting program: E:\Marcin\temp\2005-07-30\UDP/a.exe

Program received signal SIGINT, Interrupt.
[Switching to thread 1104.0x2dc]
0x7940de3e in _libwsock32_a_iname ()
(gdb) q
The program is running.  Exit anyway? (y or n) y

E:\Marcin\temp\2005-07-30\UDP>
  1. Jaką masz wersję GDB? Przy okazji MinGW gcc oraz wersja Windows32 API package'a.
  2. Możesz dokładnie wyjaśnić w jaki sposób dostajesz SIGSEGV. łącznie z sesją GDB. Jak to uruchamiasz, co to za Windows, itp.
  3. Czy bind() zwraca błąd z ADDR_ANY?? Nie SIGSEGV, tylko normalnie błąd w czasie pracy - SOCKET_ERROR, i daj WSAGetLastError()
0
Client>starting Client with  port:1441 and sending messages to 213.228.239.224:1
717
Client>creating the socket(AF_INET 'IP', STREAM, UDP)...[OK]
Client>binding the socket...

a GDB:

GNU gdb 5.2.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...(no debugging symbols found)...
(gdb) r
Starting program: C:\AATSI\Testy z UDP/udp.exe

Program received signal SIGSEGV, Segmentation fault.
0x77ea3c00 in _libwsock32_a_iname ()
(gdb)

a jak mam srpawdzic reszte wersji?

mam WinXP i sciagnietego Dev-CPP 4.9.9.2 z najnowszym pachem

0

moze TO pomoze rozwiazac problem</url>

0
vixen03 napisał(a)

moze TO pomoze rozwiazac problem</url>

niestety nie wiele..
najlepsze jest to program bez GDB dziala i nie ma errorow...
ale GDB pokazuje mi SIGSEGV a u marcinka nie ma takich rzeczy
i to mnie dziwi...s pod linuxem chodzi PIKNIE be SIGSEGV pod GDB wiec nie kumam...

PS. quit zakonczy program ;-)

EDIT:
a teraz zainstalowalem sobie GDB 6.3 i najnowsze WINAPI 32 pod DEV-CPP mam takie cos (przy bindowaniu):

gdb: kernel event for pid=1056 tid=3948 code=EXCEPTION_DEBUG_EVENT)
ContinueDebugEvent (cpid=1056, ctid=3948, DBG_CONTINUE);
gdb: kernel event for pid=1056 tid=3948 code=EXCEPTION_DEBUG_EVENT)
gdb: Target exception EXCEPTION_ACCESS_VIOLATION at 0x77ea3c00

Program received signal SIGSEGV, Segmentation fault.
0x77ea3c00 in RpcRaiseException () from C:\WINDOWS\system32\rpcrt4.dll

Czy cos Ci to wicej mowi? :>

0

Hmm, nie mam pojęcia... Na odległość nie da rady tego zbadać...
A jak błędu nie zwraca to... olać? :)

A tak z innej beczki - musi być ten bind() dla klienta?? Serwer tylko z portu 1441 przyjmuje???

0
marcinEc napisał(a)

Hmm, nie mam pojęcia... Na odległość nie da rady tego zbadać...
A jak błędu nie zwraca to... olać? :)

:D :D :D

marcinEc napisał(a)

A tak z innej beczki - musi być ten bind() dla klienta?? Serwer tylko z portu 1441 przyjmuje???

moge przeciez nie bundowac tylko uzyc od razu sendto prawda? :>
Ale daje to identyczny blad (ale program dziala dalej)

Sciagnalem sobie najnowszy MiniGW (bez skutku), najnowszy GDB (to samo) i najnowsze WinApi 32 (mam rozpoznawane symbole ze to RcptRaiseException

MarcinEc rpzeciez tyle roznych czesto fragmentow wklejasz... nie masz nic na ten RcptRaiseException?? na msdn znalazlem tylko ta funkcje ale zupelnie nie wiem czemu zachodzi ten wyjatek... :/

EDIT:
A masz moze SP2 ??

0
bartosak napisał(a)
marcinEc napisał(a)

A tak z innej beczki - musi być ten bind() dla klienta?? Serwer tylko z portu 1441 przyjmuje???

moge przeciez nie bundowac tylko uzyc od razu sendto prawda? :>
Ale daje to identyczny blad (ale program dziala dalej)

Cuda i dziwy... :>

bartosak napisał(a)

MarcinEc rpzeciez tyle roznych czesto fragmentow wklejasz... nie masz nic na ten RcptRaiseException?? na msdn znalazlem tylko ta funkcje ale zupelnie nie wiem czemu zachodzi ten wyjatek... :/

Nic... Jedynie google zwraca jeden wpis nt.
http://www.google.com/search?q=0x77ea3c00+in+RpcRaiseException+()+from+C:\WINDOWS\system32\rpcrt4.dll
ale to nic nie daje...

  1. Tak mi wpadło do głowy, że może coś masz na tym porcie, ale to byś dostał error (UDP), albo nic (listen na TCP)...

  2. Może ta usługa RPC coś nie ten-tego jest? A może trojan czy coś...?

  3. A jakbyś skompilował z debugiem (flaga -g dla GCC), odpalił GDB, dał run, poczekał na błąd i dał polecenie backtrace. Może tu coś będzie widać?

Mam win2000 :) i alergię na XP

0
marcinEc napisał(a)
  1. Tak mi wpadło do głowy, że może coś masz na tym porcie, ale to byś dostał error (UDP), albo nic (listen na TCP)...

Nie ma znaczenia jaki port...

marcinEc napisał(a)
  1. Może ta usługa RPC coś nie ten-tego jest? A może trojan czy coś...?

Usluga rzucania wyjatkami.. podejrzewam ze cos skopali w SP2

marcinEc napisał(a)
  1. A jakbyś skompilował z debugiem (flaga -g dla GCC), odpalił GDB, dał run, poczekał na błąd i dał polecenie backtrace. Może tu coś będzie widać?

Widac ze niewiele (najwazniejszy skladnik wyjalem:

#0  0x77ea3c00 in RpcRaiseException () from C:\WINDOWS\system32\rpcrt4.dll
#1  0x66787258 in _libwsock32_a_iname () from C:\WINDOWS\system32\hnetcfg.dll

cos jest nie ten tego w tych DLL'ach ... najwyzej sobie jeszcze testa u kogos zrobie kto nie ma XP i zobaczymy

marcinEc napisał(a)

Mam win2000 :) i alergię na XP

Ja tez wole W2K (a tak w ogóle to Slackware RULEZ ! i biblioteczka QT)
ale wg siósrt jest brzydki a one chca miec kolorowo..
Wiec jak sie ma 2 siostry to sie nie dyskutuje bo od piskow glowa boli
:)

PS. Najwyzej dam Ci do skompilowania swoj programik co? :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1