Line 10... |
Line 10... |
10 |
// |
10 |
// |
11 |
// 1.00 2012_09 Proof of concept (no configuration, not for public release) |
11 |
// 1.00 2012_09 Proof of concept (no configuration, not for public release) |
12 |
// 1.01 2012_09 Added parameter for device selection |
12 |
// 1.01 2012_09 Added parameter for device selection |
13 |
// 1.02 2012_12 Error handling and debugged |
13 |
// 1.02 2012_12 Error handling and debugged |
14 |
// 1.03 2012_12 Release version ready to publish |
14 |
// 1.03 2012_12 Release version ready to publish |
- |
|
15 |
// 1.04 2013_04 Socket Bind Error with eplanation (multiple instance of XVC Server) |
15 |
// |
16 |
// |
16 |
// |
17 |
// |
17 |
// Purpose: |
18 |
// Purpose: |
18 |
// |
19 |
// |
19 |
// XILINX development software (ISE, WebPack) supports several types of JTAG programming |
20 |
// XILINX development software (ISE, WebPack) supports several types of JTAG programming |
Line 77... |
Line 78... |
77 |
// |
78 |
// |
78 |
// Possible improvements: |
79 |
// Possible improvements: |
79 |
// |
80 |
// |
80 |
// Linux version (Winsock library differs). |
81 |
// Linux version (Winsock library differs). |
81 |
// External definition of JTAG pins. |
82 |
// External definition of JTAG pins. |
- |
|
83 |
// Enable Socket Number (to be able to run multiple XVC Servers), now it is constant XVC_TCP_PORT (should be only a default) |
82 |
|
84 |
|
83 |
|
85 |
|
84 |
// Library Definitions |
86 |
// Library Definitions |
85 |
// ------------------- |
87 |
// ------------------- |
86 |
|
88 |
|
Line 463... |
Line 465... |
463 |
|
465 |
|
464 |
// Bind the SOCKED (assign the address) |
466 |
// Bind the SOCKED (assign the address) |
465 |
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); |
467 |
iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen); |
466 |
if (iResult == SOCKET_ERROR) |
468 |
if (iResult == SOCKET_ERROR) |
467 |
{ |
469 |
{ |
- |
|
470 |
int LastError=WSAGetLastError(); |
468 |
fprintf(stderr, "Bind failed with error: %d\n", WSAGetLastError()); |
471 |
fprintf(stderr, "Bind failed with error: %d\n", LastError); |
- |
|
472 |
if (LastError==10048) fprintf(stderr, "Trying to start second instance of XVC Server?\n"); |
469 |
freeaddrinfo(result); |
473 |
freeaddrinfo(result); |
470 |
closesocket(ListenSocket); |
474 |
closesocket(ListenSocket); |
471 |
WSACleanup(); |
475 |
WSACleanup(); |
472 |
jtagClosePort(); |
476 |
jtagClosePort(); |
473 |
return -2; |
477 |
return -2; |
Line 485... |
Line 489... |
485 |
|
489 |
|
486 |
// Listen SOCKET |
490 |
// Listen SOCKET |
487 |
iResult = listen(ListenSocket, SOMAXCONN); |
491 |
iResult = listen(ListenSocket, SOMAXCONN); |
488 |
if (iResult == SOCKET_ERROR) |
492 |
if (iResult == SOCKET_ERROR) |
489 |
{ |
493 |
{ |
490 |
printf("listen failed with error: %d\n", WSAGetLastError()); |
494 |
fprintf(stderr, "listen failed with error: %d\n", WSAGetLastError()); |
491 |
closesocket(ListenSocket); |
495 |
closesocket(ListenSocket); |
492 |
WSACleanup(); |
496 |
WSACleanup(); |
493 |
jtagClosePort(); |
497 |
jtagClosePort(); |
494 |
return -2; |
498 |
return -2; |
495 |
} |
499 |
} |
Line 505... |
Line 509... |
505 |
sockaddr ClientSocetAddr; |
509 |
sockaddr ClientSocetAddr; |
506 |
int ClientSocetAddrLen = sizeof(sockaddr); |
510 |
int ClientSocetAddrLen = sizeof(sockaddr); |
507 |
ClientSocket = accept(ListenSocket, &ClientSocetAddr, &ClientSocetAddrLen); |
511 |
ClientSocket = accept(ListenSocket, &ClientSocetAddr, &ClientSocetAddrLen); |
508 |
if (ClientSocket == INVALID_SOCKET) |
512 |
if (ClientSocket == INVALID_SOCKET) |
509 |
{ |
513 |
{ |
510 |
printf("accept failed with error: %d\n", WSAGetLastError()); |
514 |
fprintf(stderr, "accept failed with error: %d\n", WSAGetLastError()); |
511 |
closesocket(ListenSocket); |
515 |
closesocket(ListenSocket); |
512 |
WSACleanup(); |
516 |
WSACleanup(); |
513 |
jtagClosePort(); |
517 |
jtagClosePort(); |
514 |
return -2; |
518 |
return -2; |
515 |
} |
519 |
} |