int pkg_pack(char *buf,void *net_struct,T_PkgType *pkg_type,char delimit) { char *cp; register char *cp1; register T_PkgType *typ; cp=buf; if(!cp)return -1; cp1=cp; typ=pkg_type; if(typ->offset<0) set_offset(pkg_type);// at netvar.c for(;typ->type>-1;typ++) { if(typ->bindtype&NOSELECT) continue; if(typ->type==CH_STRUCT) { cp1+=pkg_pack(cp1,(char *)net_struct+typ->offset,(T_PkgType *)typ->format,delimit); continue; } cp1+=get_one_str(cp1,net_struct,typ,delimit); *cp1++=delimit; *cp1=0; } return (cp1-cp); }
int main ( int argc, char *argv[] ) { char szRemoteIp[]="127.0.0.1"; uint16_t usRemotePort=32000; uint8_t szSndBuf[1024]; int32_t iSndLen=sizeof(szSndBuf); uint8_t szBody[]="test"; uint32_t uLenLeft; uint32_t uLenSend; uint32_t uLenOneMsg; //uint32_t ulTimeout=1000; //ms struct sockaddr_in m_astTcpSvrAddr; int iSocket = -1; int iFlags = 1; //struct timeval tmTimeout; //uint8_t szRcvBuf[1024]={0}; //int32_t usRecvBufLen=sizeof(szRcvBuf); int iRcvBufLen = 8 * 1024; int i; //当对方关闭tcp socket,此时再发送数据时将会产生此信号,不处理的话程序将会异常退出 signal(SIGPIPE, SIG_IGN); if((iSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { return -1 ; } if(setsockopt(iSocket, SOL_SOCKET, SO_REUSEADDR, &iFlags, sizeof(iFlags)) == -1) { close(iSocket); return -1; } if(setsockopt(iSocket, SOL_SOCKET, SO_RCVBUF, (char*)&iRcvBufLen, sizeof(iRcvBufLen)) == -1) { close(iSocket); return -1 ; } bzero(&m_astTcpSvrAddr, sizeof(m_astTcpSvrAddr)); m_astTcpSvrAddr.sin_family = AF_INET; m_astTcpSvrAddr.sin_addr.s_addr = inet_addr(szRemoteIp); m_astTcpSvrAddr.sin_port = htons(usRemotePort); if((connect(iSocket,(struct sockaddr *)&m_astTcpSvrAddr,sizeof(m_astTcpSvrAddr)))<0) { close(iSocket); return -1 ; } uLenOneMsg=pkg_pack( szBody, strlen((const char*)szBody),0, szSndBuf, iSndLen); if(uLenOneMsg<0) { return -1; } iSndLen=uLenOneMsg; for(i=0; i<=2; i++) { memcpy(szSndBuf+iSndLen, szSndBuf, uLenOneMsg); iSndLen+=uLenOneMsg; } uLenLeft = iSndLen ; uLenSend = 0; while(uLenLeft>0){ int byte_send = send(iSocket, szSndBuf + uLenSend, 2, 0); if(byte_send<=0){ printf("errno: %d errstr: %s\n", errno, strerror(errno)); close(iSocket); return -1 ; } uLenSend+=byte_send; uLenLeft-=byte_send; sleep(1); } printf("send one\n"); //1,封装数据 //2,创建、连接端口 //3,发送数据 //4,接收数据 return 0; }