C++ socket 实参传递的两种写法

来源:互联网 发布:网络教学管理平台 编辑:程序博客网 时间:2024/06/14 19:27

第一个参数socket的参数是需要改变的,后面几个的值是不需要改变的第一种写法,用&函数定义BOOL InitSocket(SOCKET& s,u_short port,unsigned int msg,CString str_flag);函数实现/*InitSocket() 参数说明*参数1 套接字       如m_socket*参数2 套接字端口   如8000      *参数3 套接字标志   如UM_SOCK*/BOOL CGpsudpDlg::InitSocket(SOCKET& s,u_short port,unsigned int msg,CString str_flag)  //套接字初始化{CString str;     //create  base station socket  10.10.10.119  : 8000s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);   if(INVALID_SOCKET == s)  // if error{  str.Format("%s--%s",str_flag,"套接字创建失败!");  MessageBox(str);  return FALSE;}SOCKADDR_IN addrSock;  //address  the struct of address addrSock.sin_family = AF_INET;addrSock.sin_port = htons(port);addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);int retval;//band the socket: connect the m_socket to addrSock retval=bind(s,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));    if(SOCKET_ERROR==retval){closesocket(s);str.Format("%s---%s",str_flag,"绑定失败!");MessageBox(str);return FALSE;}    if(SOCKET_ERROR==WSAAsyncSelect(s,m_hWnd,msg,FD_READ)){   str.Format("%s---%s",str_flag,"注册失败!");MessageBox(str);return FALSE;}return TRUE;}函数引用InitSocket(base_socket,base_port,BASE_SOCK,base_socket_str)的参数为base_socket,引用时表示取base_socket的地址,所以可以改变base_socket的值 if(FALSE==InitSocket(base_socket,base_port,BASE_SOCK,base_socket_str)){date_str1.Format("%d-%d-%d %s",CTime::GetCurrentTime().GetYear(),CTime::GetCurrentTime().GetMonth(),CTime::GetCurrentTime().GetDay(),CTime::GetCurrentTime().Format("%I:%M:%S %p"));fp1=fopen("log.txt","at+");if (fp1==NULL){  return FALSE;}fp_str1="Socket初始化错误";        fprintf(fp1,"%s,%s\n",date_str1,fp_str1);fclose(fp1);  return FALSE;}第二种方式,用*BOOL InitSocket(SOCKET* s,u_short port,unsigned int msg,CString str_flag);/*InitSocket() 参数说明*参数1 套接字       如m_socket*参数2 套接字端口   如8000      *参数3 套接字标志   如UM_SOCK*/下面对s进行了*s操作BOOL CGpsudpDlg::InitSocket(SOCKET* s,u_short port,unsigned int msg,CString str_flag)  //套接字初始化{CString str;    //create  base station socket  10.10.10.119  : 8000*s=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,0);    //parameter 2 means udp  base stationif(INVALID_SOCKET == *s)  // if error{str.Format("%s--%s",str_flag,"套接字创建失败!");MessageBox(str);return FALSE;}SOCKADDR_IN addrSock;  //address  the struct of address addrSock.sin_family = AF_INET;addrSock.sin_port = htons(port);addrSock.sin_addr.S_un.S_addr = htonl(INADDR_ANY);int retval;//band the socket: connect the m_socket to addrSock retval=bind(*s,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));    if(SOCKET_ERROR==retval){   closesocket(*s);   str.Format("%s---%s",str_flag,"绑定失败!");   MessageBox(str);           return FALSE;}    if(SOCKET_ERROR==WSAAsyncSelect(*s,m_hWnd,msg,FD_READ)){      str.Format("%s---%s",str_flag,"注册失败!");   MessageBox(str);   return FALSE;}return TRUE;}下面调用的时候用了&if(FALSE==InitSocket(&base_socket,base_port,BASE_SOCK,base_socket_str)){date_str1.Format("%d-%d-%d %s",CTime::GetCurrentTime().GetYear(),CTime::GetCurrentTime().GetMonth(),CTime::GetCurrentTime().GetDay(),CTime::GetCurrentTime().Format("%I:%M:%S %p"));fp1=fopen("log.txt","at+");if (fp1==NULL){return FALSE;}fp_str1="Socket初始化错误";fprintf(fp1,"%s,%s\n",date_str1,fp_str1);fclose(fp1);  return FALSE;}效果如图



两种写法的原理是一样的,实现的效果也是一样的,如果有什么不对的地方,欢迎大家留言讨论~微笑

原创粉丝点击