e_int32 Socket_Connect(socket_t *socket) { int sockfd, sockLen; int ret; struct sockaddr_in peer_address; struct sockaddr_un sockAddr; unsigned long ul = 1; e_assert((socket && socket->state), E_ERROR); sockfd = (int) socket->priv; // ret = ioctl(sockfd, FIONBIO, &ul); //设置为非阻塞模式 // e_assert(ret==0, E_ERROR_INVALID_CALL); switch (socket->type) { case E_SOCKET_TCP: case E_SOCKET_UDP: peer_address.sin_family = AF_INET; ret = inet_aton(socket->ip_address, &peer_address.sin_addr); // store IP in antelope e_assert(ret, E_ERROR_INVALID_ADDRESS); peer_address.sin_port = htons(socket->port); ret = connect(sockfd, (struct sockaddr *) &peer_address, sizeof(struct sockaddr)); break; case E_SOCKET_NAME: ret = make_unix_domain_addr(socket->ip_address, &sockAddr, &sockLen); e_assert(ret>0, E_ERROR_IO); ret = connect(sockfd, (const struct sockaddr*) &sockAddr, sockLen); break; default: return E_ERROR_INVALID_HANDLER; } if (ret == -1) { fd_set set; int len = sizeof(int); struct timeval tm; tm.tv_sec = 1; tm.tv_usec = 0; FD_ZERO(&set); FD_SET(sockfd, &set); if (select(sockfd + 1, NULL, &set, NULL, &tm) > 0) { getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &ret, (socklen_t *) &len); if (ret == 0) ret = E_OK; else ret = E_ERROR_IO; } else ret = E_ERROR_IO; } else ret = E_OK; // ul = 0; // ioctl(sockfd, FIONBIO, &ul); //设置为阻塞模式 // DMSG((STDOUT,"Socket_Connect address=%s sockfd=%d ret=%d\n",socket->ip_address,sockfd,ret)); return ret; }
void EGL_SEND(int size, int frames) { int sock, i, j, s; socklen_t slen; char buf[100], *sbuf; printf("-> Start...\n"); #if SOCKET_TCP struct sockaddr_in server; if ( (sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) { return; } memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; inet_aton(IP_ADDRESS,&server.sin_addr); // server.sin_addr.s_addr = inet(IP_ADDRESS);//htonl(INADDR_ANY); server.sin_port = htons(PORT); #else struct sockaddr_un server; sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { perror("opening stream socket"); return; } make_unix_domain_addr(NAME, &server, &slen); #endif if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { close(sock); perror("connecting stream socket"); return; } printf("-> Connected...\n"); sprintf(buf, HEAD, size, size,1.0); if (send(sock, buf, 26, 0) < 0) perror("writing on stream socket"); printf("-> Send size done...\n"); printf("-> Send frame\n"); if (frames == -1) frames = 65535; sbuf = (char*) malloc(size * size); for (i = 0; i < frames; i++) { create_image(sbuf, i, size); s = send(sock, sbuf, size * size, 0); if (s < 0) break; sleep(1); } free(sbuf); close(sock); }
e_int32 Socket_Bind(socket_t *socket) { int sockfd; int ret, sockLen; struct sockaddr_in peer_address; struct sockaddr_un sockAddr; e_assert((socket && socket->state), E_ERROR); sockfd = (int) socket->priv; switch (socket->type) { case E_SOCKET_TCP: case E_SOCKET_UDP: /*监听的IP可以为空*/ if (strlen(socket->ip_address) == 0) peer_address.sin_addr.s_addr = htonl(INADDR_ANY); else { ret = inet_aton(socket->ip_address, &peer_address.sin_addr); // store IP in antelope e_assert(ret, E_ERROR_INVALID_ADDRESS); } peer_address.sin_family = AF_INET; peer_address.sin_port = htons(socket->port); ret = bind(sockfd, (struct sockaddr *) &peer_address, sizeof(struct sockaddr_in)); break; case E_SOCKET_NAME: if (!make_unix_domain_addr(socket->ip_address, &sockAddr, &sockLen)) return E_ERROR_IO; ret = bind(sockfd, (const struct sockaddr*) &sockAddr, sockLen); break; } e_assert((ret != SOCKET_ERROR), E_ERROR_IO); return E_OK; }