zoukankan      html  css  js  c++  java
  • 利用socket编写windows和linux通讯程序

    socket编程大家都很熟悉,我在这里就不再罗嗦了。直接切入正题。该程序分两部分,server端和client端(谁都知道)。其中server端采用windows平台,那linux平台当然是client端了。
    这里是server端程序:
    /**********************************/
    /* it worked as server under windows platform */
    /* written by mlsx 1998-2-7                     */
    /************************************/

    include <windows.h>
    #include <stdio.h>
    #pragma comment (lib,"WS2_32.lib")
    #define USERPORT 10001
    #define HOST_IP_ADDR "127.0.0.1"

    main(int argc,char *argv[])
    {
    char buf[128];
    SOCKET s,ns;
    struct sockaddr_in client;
    struct sockaddr_in server;
    int namelen,pklen;
    int status;
    WSADATA wsd;
    if((status=WSAStartup(MAKEWORD(2,2),&wsd))!=0)
    {
      perror("wsastartup() failed:");
       exit(1);
    }
    if((s=socket(AF_INET,SOCK_STREAM,0))< 0)
    {
      perror("socket failed :");
      exit(1);
    }
    ZeroMemory(&server,sizeof(server));
    server.sin_family=AF_INET;
    server.sin_port=htons(USERPORT);
    server.sin_addr.s_addr=htons(INADDR_ANY);
    if(bind(s,(struct sockaddr *)&server,sizeof(server))<0)
    {
      perror("bind() failed:");
      exit(2);
    }
    if(listen(s,4)!=0)
    {
      perror("listen()failed :");
      exit(3);
    }
    while(1)
    {
    namelen=sizeof(client);
    if((ns=accept(s,(struct sockaddr*)&client,&namelen))==-1)
    {
      perror("accept()failed:");
      exit(4);
    }
    printf("accept successful");
    for(;;)
    {
      if((pklen=recv(ns,buf,128,0))<0)
      {
       perror("recv() failed:");
       exit(5);
      }
      else
       if(pklen==0)
       {
        printf("recv():return FAILED,connected is shut down");
        break;
       }
       else
        printf("recv():return success,packet length=%d context is %s/n",pklen,buf);
      
      Sleep(1);
      //printf("the buf is %s/n",buf);
      if(send(ns,buf,128,0)<0)
      {
       perror("send() failed:");
       break;
      }
      else
       printf("send() return success packet length is %d/n",pklen);
    }
    }
    closesocket(ns);
    closesocket(s);
    printf("server ended successfully/n");
    }



    这里是client端程序:

    /**********************************/
    /* it worked as client under linux platform */
    /* written by mlsx 1998-2-7                     */
    /************************************/
    #include <windows.h>
    //#include <winsock2.h>
    #include <stdio.h>
    #pragma comment (lib,"WS2_32.lib")
    #define USERPORT 5003
    main(int argc,char *argv[])
    {
    char buf[128];
    SOCKET sclient;
    struct sockaddr_in server;
    int namelen,pklen;
    int status,ret;
    char szmessage[128];
    WSADATA wsd;
    if(argc<2)
    {
      printf("usage:/n");
      printf("%s ipaddr",__FILE__);
      printf("ipaddr is the server's ip address,like xxx.xxx.xxx.xxx/n");
      exit(1);
    }
    if((status=WSAStartup(MAKEWORD(2,2),&wsd))!=0)
    {
      perror("wsastartup() failed:");
       exit(1);
    }
    if((sclient=socket(AF_INET,SOCK_STREAM,0))< 0)
    {
      perror("socket failed :");
      exit(1);
    }
    ZeroMemory(&server,sizeof(server));
    ZeroMemory(szmessage,sizeof(szmessage));
    server.sin_family=AF_INET;
    server.sin_port=htons(USERPORT);
    server.sin_addr.s_addr=inet_addr(argv[1]);
    if(connect(sclient,(struct sockaddr *)&server,sizeof(server))<0)
    {
      perror("connect() failed :");
      printf("%d",WSAGetLastError());
      exit(3);
    }
    namelen=sizeof(sclient);

    /*for(ret=0;ret<10;ret++)
    {
      
      if(send(sclient,szmessage,sizeof(szmessage),0)<0)
      {
       perror("send() failed:");
       break;
      }

      printf("send() return success/n  context is %s /n",szmessage);
      if((pklen=recv(sclient,buf,sizeof(buf),0))<0)
      {
       perror("recv() failed:");
       exit(5);
      }
      else
       if(pklen==0)
       {
        printf("recv():return FAILED,connected is shut down");
        break;
       }
       else
       {
        printf("the pktlen is %d/n",pklen);
        buf[pklen]='/0';
        printf("recv():return success/npacket length=%d and the context is %s/n",pklen,buf);
        ZeroMemory(buf,sizeof(buf));
       }
       Sleep(10);
    }*/
    //while(strcmp(szmessage,"q"))
    while(1)
    {
      
      ZeroMemory(szmessage,sizeof(szmessage));
      //scanf("%s",szmessage);
      //puts(szmessage);
      //gets(szmessage);
      //send(sclient,szmessage,sizeof(szmessage),0);
      //Sleep(10);
      ZeroMemory(buf,sizeof(buf));
      ret=recv(sclient,buf,sizeof(buf),0);
      buf[ret]='/0';
      //printf("%s the length is %d ",buf,ret);
      puts(buf);
      Sleep(1);
      
    }

      
    closesocket(sclient);
    WSACleanup();
    printf("server ended successfully/n");
    return 0;
    }

  • 相关阅读:
    分享的选择
    @contextmanager 另外一种实现上下文的方法(含yield 生成器)
    Linux ☞ Good good study,day day up
    Linux常用命令
    python 新手遇到的问题
    Pyqt 基础功能
    redis安装使用
    python 对任意文件(jpg,png,mp3,mp4)base64的编码解码
    PHP7.* AES的加密解密
    Ubuntu宝塔面板设置网站 Apache Server API为Apache 2.0 Handler模式
  • 原文地址:https://www.cnblogs.com/cy163/p/1559534.html
Copyright © 2011-2022 走看看