winsock-prosty klient

0

hej ;)
na zajecia mam zaprogramowac program ktory bedzie sie komunikowal z podanym serwerem za pomoca podanych komend (przez udp).

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <winsock.h>

#define MAXRCVLEN 512
#define PORTNUM 22333
char *query = "GET_VOL";//jedno z zapytan ktore obsluguje serwer
int main(){
	char buffer[MAXRCVLEN+1];
	int len, mysocket;
	struct sockaddr_in dest; 
	char *host_ip =NULL;
	WSADATA wsaData;
	host_ip = "127.0.0.1";

	// if this doesn't work
	//WSAData wsaData; // then try this instead
	// MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0:
	if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
		fprintf(stderr, "WSAStartup failed.\n");
		exit(1);
	}
	mysocket = socket(AF_INET, SOCK_DGRAM, 0);

	dest.sin_family = AF_INET; 
	dest.sin_addr.s_addr = inet_addr(host_ip); /* ustawiamy adres hosta */
	dest.sin_port = htons (PORTNUM); /* numer portu przechowuje dwubajtowa zmienna - musimy ustalić porządek sieciowy - Big Endian */
	memset(&(dest.sin_zero), '\0', 8); /* zerowanie reszty struktury */

	connect(mysocket, (struct sockaddr *)&dest,sizeof(struct sockaddr)); /* łączymy się z hostem */
	write(mysocket, query, strlen(query)); /* wysyłamy zapytanie */
	len=read(mysocket, buffer, MAXRCVLEN); /* i pobieramy odpowiedź */

	buffer[len]='\0';

	printf("Rcvd: %s",buffer);
	closesocket(mysocket); /* zamykamy gniazdo */
	return EXIT_SUCCESS;
	return 0;
}

schemat wzialem stąd: http://pl.wikibooks.org/wiki/C/Przyk%C5%82ady_z_komentarzem
pokombinowalem z tym: http://beej.us/guide/bgnet/output/print/bgnet_A4.pdf
programuje w Visual Studio.
calosc sie kompiluje, chociaz niby podkresla ze write i read są undefined.
po odpaleniu wywala blad

 
Debug Assertion failed!
Program:(sciezka do .exe)
File: f:dd\vctools\crt_bld\self_x86\crt\src\write.c
Line: 81
Expression (fh>=0 && (unsigned)fh < (unsigned)_lhandle)

blablalba see the Visual Studio documentation
Press retry to debug application

jakies wskazowki? generalnie z programowaniem nie mam problemu, tylko tu zostalem "rzucony na gleboka wode" i robie po omacku ;)

0

Uzywalem WinSocka lata temu i troche nie chce mi sie do tego wszystiego wracac, jednak prawdopodobnie w kodzie brakuje Ci binda. U mnie kod, ktory podales sie nie kompilowal ze wzgledu na brak funkcji write i read wiec zastapilem je odpowiednio funkcja send i recv. Zmodyfikowalem Twoj kod do nastepujacej postaci

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <WinSock2.h>
#include <winsock.h>

#define MAXRCVLEN 512
#define PORTNUM 22333
char *query = "GET_VOL";//jedno z zapytan ktore obsluguje serwer
int main(){
	char buffer[MAXRCVLEN+1];
	int len, mysocket;
	struct sockaddr_in dest; 
	char *host_ip =NULL;
	WSADATA wsaData;
	host_ip = "127.0.0.1";

	// if this doesn't work
	//WSAData wsaData; // then try this instead
	// MAKEWORD(1,1) for Winsock 1.1, MAKEWORD(2,0) for Winsock 2.0:
	if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
		fprintf(stderr, "WSAStartup failed.\n");
		exit(1);
	}
	mysocket = socket(AF_INET, SOCK_DGRAM, 0);

	dest.sin_family = AF_INET; 
	dest.sin_addr.s_addr = inet_addr(host_ip); /* ustawiamy adres hosta */
	dest.sin_port = htons (PORTNUM); /* numer portu przechowuje dwubajtowa zmienna - musimy ustalić porządek sieciowy - Big Endian */
	memset(&(dest.sin_zero), '\0', 8); /* zerowanie reszty struktury */

	bind(mysocket, (sockaddr*)&dest, sizeof(struct sockaddr_in));
	connect(mysocket, (struct sockaddr *)&dest,sizeof(struct sockaddr)); /* łączymy się z hostem */
	send(mysocket, query, strlen(query), 0); /* wysyłamy zapytanie */
	len=recv(mysocket, buffer, MAXRCVLEN, 0); /* i pobieramy odpowiedź */

	buffer[len]='\0';

	printf("Rcvd: %s",buffer);
	closesocket(mysocket); /* zamykamy gniazdo */
	return EXIT_SUCCESS;
}

Powyzszy kod ma charakter pogladowy - nie chcialem go za bardzo modyfikowac, bo nie mialo to sensu. Sprawdz po prostu czy dziala i najlepiej zrob to od nowa, tym razem porzadnie (tj. z obsluga bledow itp).

Na koniec kilka uwag:

connect(mysocket, (struct sockaddr *)&dest,sizeof(struct sockaddr));

To cale sizeof mi sie nie podoba. Sprawdzasz rozmiar struktury sockaddr podczas gdy korzystasz ze struktury sockaddr_in.

Ponadto skoro wywolales wczesniej funkcje WSAStartup to dobrze byloby pozniej wywolac WSACleanup().

0

ok, wszystko działa, dzieki wielkie ;)

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