
Эксперт
  
Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower
Репутация: 1 Всего: 37
|
Привет. Пытаюсь достучаться до TCP сервера из Silverlight контрола Код сервера | Код | #include <stdio.h> #include <winsock2.h> #include <windows.h> #include <string.h>
#define MY_PORT 4530 #define POLICE_PORT 943 // Silverlight policy server port DWORD WINAPI DoWorkToClient(LPVOID client_socket) { SOCKET my_sock; my_sock=((SOCKET *) client_socket)[0]; char buff[20*1024]; int bytes_recv = 0;
printf("Server client acepted\n");
while( bytes_recv = recv(my_sock, buff, sizeof(buff), 0) && bytes_recv != SOCKET_ERROR ) send(my_sock,&buff[0],bytes_recv,0); closesocket(my_sock); return 0; }
DWORD WINAPI TcpServer(LPVOID arg) { char buff[1024]; SOCKET mysocket; printf("Server starting...\n");
if (WSAStartup(0x0202,(WSADATA *)buff)) { printf("Error WSAStartup %d\n", WSAGetLastError()); return -1; }
if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0) { printf("Error socket %d\n",WSAGetLastError()); WSACleanup(); return -1; } sockaddr_in local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=htons(MY_PORT); local_addr.sin_addr.s_addr=0;
if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr))) { printf("Error bind %d\n",WSAGetLastError()); closesocket(mysocket); WSACleanup(); return -1; }
if (listen(mysocket, 0x100)) { printf("Error listen %d\n",WSAGetLastError()); closesocket(mysocket); WSACleanup(); return -1; }
printf("Listening..."); SOCKET client_socket; sockaddr_in client_addr; int client_addr_size=sizeof(client_addr);
while((client_socket = accept(mysocket, (sockaddr *) &client_addr, &client_addr_size))) { DWORD thID; CreateThread(NULL,NULL,DoWorkToClient, &client_socket,NULL,&thID); }
WSACleanup(); }
DWORD WINAPI PoliceToClient(LPVOID client_socket) { static char response[] = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"1024-10000\" /></cross-domain-policy>";
SOCKET my_sock; int bytes_recv = 0; my_sock=((SOCKET *) client_socket)[0]; char buff[20*1024];
printf("Policy server client acepted\n");
::ZeroMemory(buff, sizeof(buff));
bytes_recv = recv(my_sock, buff, sizeof(buff), 0);
if (bytes_recv != SOCKET_ERROR) { printf("%s\n reveived", buff);
send(my_sock, response, strlen(response), 0); printf("%s sended\n", response);
char c = '\0'; send(my_sock, &c, 1, 0); } closesocket(my_sock);
return 0; }
DWORD WINAPI PoliceServer(LPVOID arg) { char buff[1024]; SOCKET mysocket; printf("Police server starting...\n");
if (WSAStartup(0x0202,(WSADATA *)buff)) { printf("Error WSAStartup %d\n", WSAGetLastError()); return -1; }
if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0) { printf("Error socket %d\n",WSAGetLastError()); WSACleanup(); return -1; } sockaddr_in local_addr; local_addr.sin_family=AF_INET; local_addr.sin_port=htons(POLICE_PORT); local_addr.sin_addr.s_addr=0;
if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr))) { printf("Error bind %d\n",WSAGetLastError()); closesocket(mysocket); WSACleanup(); return -1; }
if (listen(mysocket, 0x100)) { printf("Error listen %d\n",WSAGetLastError()); closesocket(mysocket); WSACleanup(); return -1; }
printf("Listening..."); SOCKET client_socket; sockaddr_in client_addr; int client_addr_size=sizeof(client_addr);
while((client_socket = accept(mysocket, (sockaddr *) &client_addr, &client_addr_size))) { DWORD thID; CreateThread(NULL,NULL,PoliceToClient, &client_socket,NULL,&thID); }
WSACleanup(); }
int main(int argc, char* argv[]) {
DWORD thID, policyThID;
// Main server thread HANDLE mainHandle = CreateThread(NULL,NULL,TcpServer, NULL ,NULL,&thID);
// Policy server thread HANDLE policyThHandle = CreateThread(NULL,NULL,PoliceServer, NULL ,NULL,&policyThID);
WaitForSingleObject(mainHandle, INFINITE); return 0; }
|
Код в контроле | Код |
private void Button_Click(object sender, RoutedEventArgs e) { DnsEndPoint endPoint = new DnsEndPoint("127.0.0.1", 4530); Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.UserToken = sock; args.RemoteEndPoint = endPoint; args.Completed += OnSocketConnectionCompleted; sock.ConnectAsync(args); }
private void OnSocketConnectionCompleted(object sender, SocketAsyncEventArgs args) { if (args.SocketError != SocketError.Success) { return; } }
|
Получаю AccessDenied в SockError постоянно. Вроде policy правильный. Что может быть не так?
|