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.
- Serwer działa poprawnie, był już wcześniej wykorzystywany
- W WinXP odblokowałem odpowiedni port, próbowałem też bez firewalla - bezskutecznie
- Pingi przechodzą w obie strony
- Komunikacja z Ubuntu na obu maszynach działa bezproblemowo
Pomocy!