Problem z WinSock

0

Witam

Mam następujący problem, przy próbie wysłania prostego strumienia danych (int lub string), od klienta(java) do serwera(c). Serwer nie odbiera tych danych - jest to albo 0 dla wysyłanego int -a albo null dla Stringa. Jak poprawić poniższe kody, aby Klient wysyłał to co ja chce ??

Klient(Java)

import java.io.*;
import java.net.*;


public class Klient {

	static ObjectOutputStream out;
	static ObjectInputStream in;
	
	public static void K() throws Exception {
		Object dane;
		char []dane2 = new char[10];
		InetAddress addr = InetAddress.getByName("localhost");
		try {
			Socket socket = new Socket(addr, 1236);
			//socket.getOutputStream().write(123);
			dane = "abc";
			out = new ObjectOutputStream(socket.getOutputStream());
			in = new ObjectInputStream(socket.getInputStream());
			dane =  in.readObject();
			System.out.println(dane);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			K();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

Server (C)

#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_PORT 1239
#define DEFAULT_BUFFER 4096
#define MAXDATASIZE     200

DWORD WINAPI ClientThread(LPVOID lpParam)
{
    SOCKET sock = (SOCKET)lpParam;
    char szBuf[DEFAULT_BUFFER];

int ia =100;

int odba,wys,i,j;
while(1){

     printf("\n  ODBIERAM \n\n");
    int numbytes;
    int buf[MAXDATASIZE];

        if ((numbytes=recv(sock, buf, MAXDATASIZE-1, 0)) == -1) {
            perror("recv");
            exit(1);

        }


int cos = 0;
cos = atoi(buf);

        printf("Received: %d",cos);

}

return 0;
}


int main()
{
    WSADATA wsd;
    SOCKET sListen,sClient;
    int iAddrSize;
    HANDLE hThread;
    DWORD dwThreadID;
    struct sockaddr_in local, client;
    struct hostent *host = NULL;


if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
{
    printf("Blad Winsock 2.2!\n");
    return 1;
}

sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sListen == SOCKET_ERROR)
{
    printf("Blad socket(): %d\n", WSAGetLastError());
    return 1;
}

local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);
if (bind(sListen, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
{
    printf("Blad bind(): %d\n", WSAGetLastError());
    return 1;
}

host = gethostbyname("localhost");
if (host == NULL)
{
    printf("Nie udalo sie wydobyc nazwy serwera\n");
    return 1;
}

listen(sListen, 8);
printf("SERWER NASLUCHUJE\n");
printf("Adres: %s, port: %d\n", host->h_name, DEFAULT_PORT);

while (1)
{
    iAddrSize = sizeof(client);

    sClient = accept(sListen, (struct sockaddr *)&client, &iAddrSize);
    if (sClient == INVALID_SOCKET)
    {
        printf("Blad funkcji accept(): %d\n", WSAGetLastError());
        return 1;
    }
    printf("Zaakceptowano polaczenie: serwer %s, port %d\n",
        inet_ntoa(client.sin_addr), ntohs(client.sin_port));

hThread = CreateThread(NULL, 0, ClientThread,
        (LPVOID)sClient, 0, &dwThreadID);

    if (hThread == NULL)
    {
        printf("Blad funkcji CreateThread(): %d\n", WSAGetLastError());
        return 1;
    }
    CloseHandle(hThread);
}
closesocket(sListen);

WSACleanup();
return 0;
}

serwer zapożyczony od kolegi bleekm

Proszę o pomoc

update

napisałem prostszy server, i w Javie wyswietla błąd - cos o nie prawidlowym nagłówku

java.io.StreamCorruptedException: invalid stream header: 64636261
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Klient.K(Klient.java:19)
at Klient.main(Klient.java:31)

a przeciez w kodzie ASCII 64636261 to dcba czyli to co wysyłam...

oto ten server

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <string>

#define port            1236

int main(){
int blad;
WORD wersja;

    WSADATA wsaData;
    wersja = MAKEWORD( 2, 2 );
    blad = WSAStartup(wersja, &wsaData );

    if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 ){
        printf("error WSA");
        WSACleanup();
    }

    struct sockaddr_in my_addr;
    struct sockaddr_in their_addr;

    SOCKET soc1, soc2;
    if ((soc1 =  socket( AF_INET, SOCK_STREAM, 0 )) == -1){
        printf("\n  Wystąpił bląd podczas tworzenia GNIAZDA !!! \n\n");
    }else{
        printf("\n  GNIAZDO zostalo stworzone   \n\n");
    }

    my_addr.sin_family = AF_INET;         // host byte order
    my_addr.sin_port = htons(1236);     // short, network byte order
    my_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    memset(&(my_addr.sin_zero), '\0', 8); // wyzeruj resztę struktury


        if (bind(soc1, (struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1) {
            perror("bind");
            exit(1);
        }

    if(listen(soc1, 10) == -1){
    printf("\n  Wystąpił bląd LISTENA() !!! \n\n");system("PAUSE");
    }
int sin_size,sendb;
char *dane;
        while(1) {
            sin_size = sizeof(struct sockaddr_in);
            if ((soc2 = accept(soc1, (struct sockaddr *)&their_addr,&sin_size)) == -1) {
                perror("accept");
                continue;
            }
            if((sendb = send(soc2,"dcba",6,0)) == -1){
             perror("send");
            }

        }


    WSACleanup();

    return 0;
}

może teraz ktoś mi powie w czym robię błąd ??

0

Wyzeruj bufer przed odbiorem lub po odbiorze dokonaj operacji buf[numbytes]=0; //to w przypadku stringu.

Pozbadz sie atoi i wyswietl string z buf.

0
macbeth napisał(a)

Wyzeruj bufer przed odbiorem lub po odbiorze dokonaj operacji buf[numbytes]=0; //to w przypadku stringu.

Pozbadz sie atoi i wyswietl string z buf.

niestety w dalszym ciągu null-a(string) lub 0(int) pokazuje ... :-(

0

Czy client napisany w C laczy i wysyla dane poprawnie czy problem dot obu klientow?

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