(windows和linux进行socket通信)

    在公司里面,我们平时使用的机器一般都是windows系统,但是开发、编译的机器往往是linux服务器。通过ping、ftp、samba、telnet、ssh,人们可以很方便与服务器连接。windows系统使用的是windows socket,而linux使用的posix socket,那么这两个socket之间是怎么通信的呢?网上关于windows与windows通信的代码很多,linux与linux通信的代码也很多,但是windows和linux通信的代码很少。这里,我就想写一个简单的socket代码,实现linux和windows的通信。


    其实,广义一点看,网页访问、邮箱、游戏、聊天工具都是利用socket实现的,当然后面实现的逻辑要比我们写的代码复杂的多。但是,我们完全可以利用简单的代码来说明socket通信问题,能做到这一点就足够了。这也是我一直推崇的方法,用最简单的代码表达最实际的功能。


    windows侧的client代码,

  1. #include <stdio.h>  
  2. #include <Windows.h>  
  3.    
  4. #pragma comment(lib,"ws2_32.lib")  
  5. #define  PORT 4000  
  6. #define  IP_ADDRESS "192.168.1.102"  
  7.    
  8. int main(int argc, char* argv[])  
  9. {  
  10.     WSADATA  Ws;  
  11.     SOCKET ClientSocket;  
  12.     struct sockaddr_in ClientAddr;  
  13.     int Ret = 0;  
  14.     char SendBuffer[MAX_PATH];  
  15.   
  16.     /* Init Windows Socket */  
  17.     if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )  
  18.     {  
  19.         printf("Init Windows Socket Failed::%d\n", GetLastError());  
  20.         return -1;  
  21.     }  
  22.    
  23.     /* Create Socket */  
  24.     ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
  25.     if ( ClientSocket == INVALID_SOCKET )  
  26.     {  
  27.         printf("Create Socket Failed::%d\n", GetLastError());  
  28.         return -1;  
  29.     }  
  30.   
  31.     ClientAddr.sin_family = AF_INET;  
  32.     ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);  
  33.     ClientAddr.sin_port = htons(PORT);  
  34.     memset(ClientAddr.sin_zero, 0x00, 8);  
  35.   
  36.     /* connect socket */  
  37.     Ret = connect(ClientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr));  
  38.     if ( Ret == SOCKET_ERROR )  
  39.     {  
  40.         printf("Connect Error::%d\n", GetLastError());  
  41.         return -1;  
  42.     }  
  43.     else  
  44.     {  
  45.         printf("Connect succedded!\n");  
  46.     }  
  47.   
  48.     while (1)  
  49.     {  
  50.         scanf("%s", SendBuffer);  
  51.   
  52.         /* send data to server */  
  53.         Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0);  
  54.         if ( Ret == SOCKET_ERROR )  
  55.         {  
  56.             printf("Send Info Error::%d\n", GetLastError());  
  57.             break;  
  58.         }  
  59.           
  60.         if('q' == SendBuffer[0])  
  61.         {  
  62.             break;  
  63.         }  
  64.     }  
  65.       
  66.     /* close socket */  
  67.     closesocket(ClientSocket);  
  68.     WSACleanup();  
  69.    
  70.     return 0;  
  71.  }  
  72.    

    linux侧的server代码,

  1. #include <netinet/in.h>      
  2. #include <sys/types.h>      
  3. #include <sys/socket.h>      
  4. #include <stdio.h>          
  5. #include <stdlib.h>         
  6. #include <string.h>         
  7.   
  8. #define HELLO_WORLD_SERVER_PORT    4000  
  9. #define LENGTH_OF_LISTEN_QUEUE 20  
  10. #define BUFFER_SIZE 1024  
  11.   
  12. int main(int argc, char **argv)  
  13. {  
  14.     struct sockaddr_in server_addr;  
  15.     int server_socket;  
  16.     int opt = 1;  
  17.      
  18.     bzero(&server_addr,sizeof(server_addr));   
  19.       
  20.     server_addr.sin_family = AF_INET;  
  21.     server_addr.sin_addr.s_addr = htons(INADDR_ANY);  
  22.     server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);  
  23.   
  24.     /* create a socket */  
  25.     server_socket = socket(PF_INET,SOCK_STREAM,0);  
  26.     if( server_socket < 0)  
  27.     {  
  28.         printf("Create Socket Failed!");  
  29.         exit(1);  
  30.     }  
  31.    
  32.     /* bind socket to a specified address*/  
  33.     setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));  
  34.     if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))  
  35.     {  
  36.         printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);   
  37.         exit(1);  
  38.     }  
  39.   
  40.     /* listen a socket */  
  41.     if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))  
  42.     {  
  43.         printf("Server Listen Failed!");   
  44.         exit(1);  
  45.     }  
  46.       
  47.     /* run server */  
  48.     while (1)   
  49.     {  
  50.         struct sockaddr_in client_addr;  
  51.         int client_socket;        
  52.         socklen_t length;  
  53.         char buffer[BUFFER_SIZE];  
  54.   
  55.         /* accept socket from client */  
  56.         length = sizeof(client_addr);  
  57.         client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);  
  58.         if( client_socket < 0)  
  59.         {  
  60.             printf("Server Accept Failed!\n");  
  61.             break;  
  62.         }  
  63.           
  64.         /* receive data from client */  
  65.         while(1)  
  66.         {  
  67.             bzero(buffer, BUFFER_SIZE);  
  68.             length = recv(client_socket, buffer, BUFFER_SIZE, 0);  
  69.             if (length < 0)  
  70.             {  
  71.                 printf("Server Recieve Data Failed!\n");  
  72.                 break;  
  73.             }  
  74.               
  75.             if('q' == buffer[0])  
  76.             {  
  77.                 printf("Quit from client!\n");  
  78.                 break;  
  79.             }  
  80.               
  81.             printf("%s\n", buffer);  
  82.         }     
  83.           
  84.         close(client_socket);  
  85.     }  
  86.       
  87.     close(server_socket);  
  88.     return 0;  
  89. }  

    windows侧的代码使用vc6.0编译就可以,而linux侧的代码用gcc就ok了,即gcc server.c -o server。首先,在linux侧输入./server,然后打开widnows侧的client程序,然后在windows侧的每一个字符输入都会在linux打印出来。如果想退出,输入q即可。但是此时server不会退出,它在等待下一个client的通信,继续服务于大家,就是这么简单。


    这里的server和client代码是根据网友的代码修改而来,一并表示感谢。如有侵权,请邮件告知。  
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值