这段时间公司项目一直用网口同底层设备交互,顾记录下,具体见代码:
int RFID_STANDARDPROTOCOL_API __stdcall Socket_SendAndRecv(SOCKET Socket, unsigned char * SendBuf , unsigned char *RecvBuf, int send_len) { int check_len = send_len - 1; int index; SendBuf[check_len] = 0; for(index = 0; index < check_len; index++) { SendBuf[check_len] += SendBuf[index]; } SendBuf[check_len] = ~SendBuf[check_len] + 1; char recvbuf[1024]={0}; fd_set fds; FD_ZERO(&fds); FD_SET(Socket, &fds); timeval time_out = {0, 0}; switch(select(Socket + 1, &fds, NULL, NULL, &time_out)) { case SOCKET_ERROR: break; case 0: break; default: { if (FD_ISSET(Socket, &fds)) { recv(Socket, (char *)recvbuf, 1024, 0); } } break; } char *sendbuf = (char *)SendBuf;//将 unsigned char* 类型的 SendBuf 强制转换为 char* 类型的 SendBuf if(send(Socket, sendbuf, send_len, 0) <= 0) return SENDERROR; int Lenth = 0; HANDLE hEventExit = NULL; WSAEVENT EventArray[2] = {WSACreateEvent(), hEventExit}; WSAEventSelect(Socket, EventArray[0], FD_READ); DWORD dwWait = WSAWaitForMultipleEvents(1, EventArray, FALSE, 1000, FALSE); if (WAIT_OBJECT_0 == dwWait) { WSANETWORKEVENTS netEvents; if (SOCKET_ERROR == WSAEnumNetworkEvents(Socket, EventArray[0], &netEvents)) { return -1; } if (!(netEvents.lNetworkEvents & FD_READ) || netEvents.iErrorCode[FD_READ_BIT]) { return -1; } if((Lenth=recv(Socket, recvbuf, sizeof(recvbuf)-1, 0))<=0) return RECVERROR; } for(index = 0; index < Lenth; index++) { RecvBuf[index] = (unsigned char)recvbuf[index]; //将 char 类型的 RecvBuf 强制转换为 unsigned char 类型的 RecvBuf } if((RecvBuf[0] == 0x0B) && (RecvBuf[3] == 0)) return SUCCESS; else return DATAERROR; } int RFID_STANDARDPROTOCOL_API __stdcall Socket_ConnectSocket(SOCKET *Socket, char *IPAddress, int Port) { //加载套接字库 WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD(1, 1); if(WSAStartup(wVersionRequested, &wsaData) != 0) { return -1; } if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) { WSACleanup(); return -1; } //创建套接字 *Socket = socket(AF_INET, SOCK_STREAM, 0); if (*Socket == INVALID_SOCKET) { WSACleanup(); return -3; } int TimeOut = 1000; //设置发送超时2秒 if(::setsockopt(*Socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) { } TimeOut = 1000; //设置接收超时2秒 if(::setsockopt(*Socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR) { } SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr = inet_addr(IPAddress); addrSrv.sin_family = AF_INET; addrSrv.sin_port = htons(Port); //向服务器发送连接请求 #define __NONE_BLOCK_CONN__ /* 非阻塞式连接 */ #ifdef __NONE_BLOCK_CONN__ unsigned long mode = 1; int iRet = ioctlsocket(*Socket, FIONBIO, &mode); if (iRet != NO_ERROR) { } int conn_ret = connect(*Socket, (sockaddr *)&addrSrv, sizeof (sockaddr) ); mode = 0; iRet = ioctlsocket(*Socket, FIONBIO, &mode); if (iRet != NO_ERROR) { } TIMEVAL timeval = {0}; timeval.tv_sec = 0; timeval.tv_usec = 950 * 1000; fd_set Write, Err; FD_ZERO(&Write); FD_ZERO(&Err); FD_SET(*Socket, &Write); FD_SET(*Socket, &Err); select(*Socket + 1, NULL, &Write, &Err, &timeval); if(FD_ISSET(*Socket, &Write)) { return SUCCESS; } // /* 阻塞式连接 */ #else if (connect(*Socket, (sockaddr *)&addrSrv, sizeof (SOCKADDR_IN) ) == 0) { return SUCCESS; } #endif else { closesocket(*Socket); WSACleanup(); return -2; } }