linux socket收发结构体

服务端代码:

View Code
/* Server code in C */
 //*
 //*Date:2012-07-03
 //*Author :CplusHua
 //*服务端发送结构体数据
 //*
 //*
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<signal.h>
#include<iostream>
using namespace std;
  int main(void)
  {
    signal(SIGPIPE,SIG_IGN);
    struct passwd
    {
        char pw_name[100];              //  Username.
        char pw_passwd[100];             // Password.
        __uid_t pw_uid;              // User ID.
        __gid_t pw_gid;             //  Group ID.
        char pw_gecos[100];              // Real name.
        char pw_dir[100];                // Home directory.
        char pw_shell[100];             //  Shell program.
    } ;
    struct passwd p;
    memset(&p,0x00,sizeof(struct passwd));
    strcpy(p.pw_name,"testuserser");
    strcpy(p.pw_passwd,"234234");
    p.pw_gid=1000;
    p.pw_uid=1012;
    strcpy(p.pw_shell,"/usr/bin");
    strcpy(p.pw_dir,"/home/");
    char sendbuff[sizeof(struct passwd)];
    memset(sendbuff,0,sizeof(sendbuff));
    memcpy(sendbuff,&p,sizeof(struct passwd));
    cout<<sendbuff<<"buff copy ok now!"<<endl;
    struct sockaddr_in stSockAddr;
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 
    if(-1 == SocketFD)
    {
      perror("can not create socket");
      exit(EXIT_FAILURE);
    }
 
    memset(&stSockAddr, 0, sizeof(struct sockaddr_in));
 
    stSockAddr.sin_family = AF_INET;
    stSockAddr.sin_port = htons(5555);
    stSockAddr.sin_addr.s_addr = INADDR_ANY;
 
    if(-1 == bind(SocketFD,(const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in)))
    {
      perror("error bind failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
 
    if(-1 == listen(SocketFD, 10))
    {
      perror("error listen failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
    cout<<"I Am Wating Client .............."<<endl;
    for(;;)
    {
      int ConnectFD = accept(SocketFD, NULL, NULL);
      if(0 > ConnectFD)
      {
       perror("error accept failed");
       close(SocketFD);
       exit(EXIT_FAILURE);
      }
        //注意此处的send的第一个参数是accept返回的描述
        send(ConnectFD, &p, sizeof(p),0);
        cout<<"数据发送成功!"<<endl;
        cout<<"已经发送的数据"<<endl;
        cout<<"用户名:"<<p.pw_name<<endl;
        cout<<"密  码:"<<p.pw_passwd<<endl;
        cout<<"G I D : "<<p.pw_gid<<endl;
        cout<<"RealNa: "<<p.pw_gecos<<endl;
        cout<<"文件夹: "<<p.pw_dir<<endl;
        cout<<"权  限:"<<p.pw_shell<<endl;
        shutdown(ConnectFD, SHUT_RDWR);
        close(ConnectFD);
    }
    close(SocketFD);
    return 0;
  }

客户端代码:

 

View Code
/* Client code in C */
 /*
 *Date:2012-07-03
 *Author :CplusHua
 *客户端接收结构体
 *
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include<iostream>
#include<signal.h>
using namespace std;
  int main(void)
  {
    signal(SIGPIPE,SIG_IGN);//防止进程意外退出
    //构造的结构体 demo
    struct passwd
    {
        char pw_name[100];               // Username.
        char pw_passwd[100];             // Password.
        __uid_t pw_uid;              // User ID.
        __gid_t pw_gid;              // Group ID.
        char pw_gecos[100];              // Real name.
        char pw_dir[100];                // Home directory.
        char pw_shell[100];              // Shell program.
    };
    struct passwd p;
    //将结构体清零
    memset(&p,0,sizeof(struct passwd));
    struct sockaddr_in stSockAddr;
    int Res;
    //套接字描述
    int SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (-1 == SocketFD)
    {
      perror("cannot create socket");
      exit(EXIT_FAILURE);
    }
    //清空
    memset(&stSockAddr, 0, sizeof(struct sockaddr_in));
 
    stSockAddr.sin_family = AF_INET;
    stSockAddr.sin_port = htons(5555);//服务器端口号
    Res = inet_pton(AF_INET, "211.87.230.12", &stSockAddr.sin_addr);//服务器IP地址(转换为网络字节)
 
    if (0 > Res)
    {
      perror("error: first parameter is not a valid address family");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
    else if (0 == Res)
    {
      perror("char string (second parameter does not contain valid ipaddress");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
 
    if (-1 == connect(SocketFD, (const struct sockaddr *)&stSockAddr, sizeof(struct sockaddr_in)))
    {
      perror("connect failed");
      close(SocketFD);
      exit(EXIT_FAILURE);
    }
    //定义一个与结构体相同大小的buffer
    char buffer[sizeof(struct passwd)];
    /* perform read write operations ... */
    memset(buffer,0x00,sizeof(buffer));
    int readRes=read(SocketFD,buffer,sizeof(buffer));
    if(readRes<0) cout<<"数据接收失败"<<endl;
 
    memcpy(&p,&buffer,sizeof(p));
    cout<<"用户名:"<<p.pw_name<<endl;
    cout<<"密  码:"<<p.pw_passwd<<endl;
    cout<<"G I D : "<<p.pw_gid<<endl;
    cout<<"RealNa: "<<p.pw_gecos<<endl;
    cout<<"文件夹: "<<p.pw_dir<<endl;
    cout<<"权  限:"<<p.pw_shell<<endl;
    shutdown(SocketFD, SHUT_RDWR);
    close(SocketFD);
    return 0;
  }

 

posted @ 2013-01-03 22:20  孤火  阅读(588)  评论(6编辑  收藏  举报