[C#/C] Komunikacja klient-serwer, UDP [solved]

0

Witam.
Mam problem - mój klient w C# (odpalany w WinXP) nie chce się komunikować z serwerem w C (odpalany na Ubuntu 10.04) .
Fragment kodu klienta:

try
            {
                if (textBox1.Text == "") throw new LoginException();

                byte[] buf = new byte[1024];
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse(textBox2.Text), 2000);

                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

                string loginAttempt = "<login>" + textBox1.Text;
                buf = Encoding.ASCII.GetBytes(loginAttempt);
                server.SendTo(buf, buf.Length, SocketFlags.None, ip);


                buf = new byte[1024];
                int receivedDataLength = server.Receive(buf);
                string msg = Encoding.ASCII.GetString(buf, 0, receivedDataLength);

                switch (msg)
                {
                    case "OK" :
                        this.Hide();
                        new MainMenu(textBox1.Text, ip);
                        break;
                    case "ServerException" :
                        throw new ServerException();
                    case "LoginException" :
                        throw new LoginException();
                }               

                //server.Close();
            }
            catch (LoginException)
            {
                MessageBox.Show("Niepoprawny login!", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (ServerException)
            {
                MessageBox.Show("Oj, nie udało połączyć się z serwerem.", "Błąd", MessageBoxButtons.OK, MessageBoxIcon.Error);
            } 

Kod serwera:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

struct sockaddr_in sockAddr;
struct sockaddr_in newAddr;

int main(int argc, char *argv[])
{ 
  int sock=socket(AF_INET, SOCK_STREAM, 0);
  if(sock < 0) printf("Nastąpił błąd przy socket!!");

 
  sockAddr.sin_family=AF_INET;
  sockAddr.sin_port=htons(2000);
  sockAddr.sin_addr.s_addr=INADDR_ANY;

  int b = bind(sock, (struct sockaddr*)&sockAddr, sizeof(sockAddr));

  listen(sock,5);
 
  
  
  int i;
  int k = -1;  

  int clients[100];
  fd_set set;
  
  while(1)
  {    
    FD_ZERO(&set);
  
    FD_SET(0, &set);
    FD_SET(sock, &set);
    for(i = 0; i <= k; i++) 
    {
      FD_SET(clients[i], &set);
    }
    
    if (k == -1) select(sock + 1, &set, NULL, NULL, NULL);
    else select(clients[k] + 1, &set, NULL, NULL, NULL);   
    
          
      
      if(FD_ISSET(sock, &set)) // new client
      {
	int size = sizeof(newAddr);
	int a = accept(sock, (struct sockaddr*)&newAddr, &size);
	clients[++k] = a;
	printf("Nowy klient : %d\n", a);
      }      
      
      
      for(i = 0; i <= k; i++)
      {
	  if(FD_ISSET(clients[i], &set))
	  {
	    char buf[100];
	    int r = read(clients[i], buf, 100);	    
	    buf[r] = '\0'; 
	    if (r > 0) printf("Klient %d napisał : %s",clients[i],buf);
	  }
      }  
  }

 
  return 0;
} 

problem pojawia się przy tej linii:

 int receivedDataLength = server.Receive(buf); 

wyskakuje exception:

An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll

Additional information: Istniejące połączenie zostało gwałtownie zamknięte przez zdalnego hosta

Teoretycznie dane zostały wysłane do serwera... on jednak nie potwierdza ani połączenia się z klientem, ani otrzymania jakiejkolwiek wiadomości.

  1. Serwer działa poprawnie, był już wcześniej wykorzystywany
  2. W WinXP odblokowałem odpowiedni port, próbowałem też bez firewalla - bezskutecznie
  3. Pingi przechodzą w obie strony
  4. Komunikacja z Ubuntu na obu maszynach działa bezproblemowo

Pomocy!

0

Solved, select się nie lubi z UDP.

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