服务端代码:
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; }