C Windows TCPClient Linux tauglich machen

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    C Windows TCPClient Linux tauglich machen

    Hallo,
    ich habe für ein Projekt einen C TCP Client gefunden welcher Multithreading beherrscht. Dieser ist für Windows und ich brauche ihn aber für Linux. Jedoch sind meine C Kenntnisse noch sehr schwach sodass es mir sehr schwer fällt den Client auf Linux umzuschreiben. Wie sieht es da eigentlich mit dem RAM verbrauch aus. Reicht das mit 512 MB Ram? Hier der Code:
    C Code

    C-Quellcode

    1. #include <windows.h>
    2. #include <stdlib.h>
    3. #include <stdio.h>
    4. #include <winsock.h>
    5. // our thread for recving commands
    6. DWORD WINAPI receive_cmds(LPVOID lpParam)
    7. {
    8. printf("thread created\r\n");
    9. // set our socket to the socket passed in as a parameter
    10. SOCKET current_client = (SOCKET)lpParam;
    11. // buffer to hold our recived data
    12. char buf[100];
    13. // buffer to hold our sent data
    14. char sendData[100];
    15. // for error checking
    16. int res;
    17. // our recv loop
    18. while(true)
    19. {
    20. res = recv(current_client,buf,sizeof(buf),0); // recv cmds
    21. Sleep(10);
    22. if(res == 0)
    23. {
    24. MessageBox(0,"error","error",MB_OK);
    25. closesocket(current_client);
    26. ExitThread(0);
    27. }
    28. if(strstr(buf,"hello"))
    29. { // greet this user
    30. printf("\nrecived hello cmd");
    31. strcpy(sendData,"hello, greetz from KOrUPt\n");
    32. Sleep(10);
    33. send(current_client,sendData,sizeof(sendData),0);
    34. }
    35. else if(strstr(buf,"bye"))
    36. { // dissconnected this user
    37. printf("\nrecived bye cmd\n");
    38. strcpy(sendData,"cya\n");
    39. Sleep(10);
    40. send(current_client,sendData,sizeof(sendData),0);
    41. // close the socket associted with this client and end this thread
    42. closesocket(current_client);
    43. ExitThread(0);
    44. }
    45. else
    46. {
    47. strcpy(sendData,"Invalid cmd\n");
    48. Sleep(10);
    49. send(current_client,sendData,sizeof(sendData),0);
    50. }
    51. // clear buffers
    52. strcpy(sendData,"");
    53. strcpy(buf,"");
    54. }
    55. }
    56. int main()
    57. {
    58. printf("Starting up multi-threaded TCP server.\r\n");
    59. // our masterSocket(socket that listens for connections)
    60. SOCKET sock;
    61. // for our thread
    62. DWORD thread;
    63. WSADATA wsaData;
    64. sockaddr_in server;
    65. // start winsock
    66. int ret = WSAStartup(0x101,&wsaData); // use highest version of winsock avalible
    67. if(ret != 0)
    68. {
    69. return 0;
    70. }
    71. // fill in winsock struct ...
    72. server.sin_family=AF_INET;
    73. server.sin_addr.s_addr=INADDR_ANY;
    74. server.sin_port=htons(123); // listen on telnet port 23
    75. // create our socket
    76. sock=socket(AF_INET,SOCK_STREAM,0);
    77. if(sock == INVALID_SOCKET)
    78. {
    79. return 0;
    80. }
    81. // bind our socket to a port(port 123)
    82. if( bind(sock,(sockaddr*)&server,sizeof(server)) !=0 )
    83. {
    84. return 0;
    85. }
    86. // listen for a connection
    87. if(listen(sock,5) != 0)
    88. {
    89. return 0;
    90. }
    91. // socket that we snedzrecv data on
    92. SOCKET client;
    93. sockaddr_in from;
    94. int fromlen = sizeof(from);
    95. // loop forever
    96. while(true)
    97. {
    98. // accept connections
    99. client = accept(sock,(struct sockaddr*)&from,&fromlen);
    100. printf("Client connected\r\n");
    101. // create our recv_cmds thread and parse client socket as a parameter
    102. CreateThread(NULL, 0,receive_cmds,(LPVOID)client, 0, &thread);
    103. }
    104. // shutdown winsock
    105. closesocket(sock);
    106. WSACleanup();
    107. // exit
    108. return 0;
    109. }


    edit: bzw. Ich weiß nich wie schwer das ist und ob das überhaupt jmd machen würde ich würde als GGL bieten das er im späteren Programm genannt wird als Autor des Serverprogrammes.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „FinnSoft“ ()

    Mit Windows Code kommst da gar nicht weit.
    Linux verwendet nämlich POSIX Threads(schnellere - beim Taskwechsel - langsamer beim erstellen)..

    linuxhowtos.org/C_C++/socket.htm

    Wenn dus verstehst dürfte das verbinden der beiden kein großes Problem darstellen...

    Aber machs doch, wie Tsuyo gesagt hat mit etwas wie QT, hast du eigt. nur vorteile(außer den Speicherplatz^^)...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---